Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Активные темы » Вопросы по Delphi (до версии 2009) - часть 6

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 5

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).


 
Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    folta

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    да, вот это само то.
     
    я не понял, куда делся мой массив в примерах с api и TArrayOfStrings, да простят меня за дремучесть. и пока не просветлят примером или комментарием строк, хоть чужим, хоть каким. вернусь с чего начинал:
     
    вот сейчас все замечательно, но считывая массив цифр из файла(ANSI), выдает критическую ошибку, мол доступ по адресу для записи закрыт..
    обозначить размеры массива?!
    но мне нужен бездонный.

    Код:
     
    procedure TForm2.RzButton2Click(Sender: TObject);
    var
       f : TextFile;
       value, i : Integer;
    begin
       if OpenDialog1.Execute then
       begin
          AssignFile(f, OpenDialog1.FileName);
          Reset(f);
     
          i := 0;
          while not SeekEof(f) do
          begin
             Read(f, value);
             Inc(i);
             key[i] := value;
          end;
          CloseFile(f);
     
       end;
    end;
    end.  

    Всего записей: 1177 | Зарегистр. 24-11-2010 | Отправлено: 17:20 06-12-2012
    R3Pa4eK



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    folta
    Нужно обозначить размер массива. Как то так:
    Подробнее...

    Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 17:45 06-12-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    folta
    Ну или увеличивать каждый раз до нужной длины: "SetLength(key, i);".

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 18:56 06-12-2012
    R3Pa4eK



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    А как добавить в файл свою информацию? Например: у меня есть файл (архив), в него нужно информацию для распаковки (offset'ы и размеры, а также упаковщик). Пока что я таскаю за собой текстовый файл, в котором записана вся информация. Но это ведь не выход...
     
    /upd
    Решено!

    Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 20:07 06-12-2012 | Исправлено: R3Pa4eK, 23:02 06-12-2012
    folta

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    снова я)
    то чего я предполагал, случилоси.

    Цитата:
    invalid numeric input

    при попытке добавить в массив из файла. хотя там только цифры, та же картина в уникоде.
    в гугле полно на эту тему, но все мимо.
    что-то надо объявить массиву...что?
    а лучше универсализировать, чтобы не спотыкалось на чтении файла и выдергивало только цифры.
    может сам дойду пешком..

    Всего записей: 1177 | Зарегистр. 24-11-2010 | Отправлено: 20:58 06-12-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    folta
    Не очень понятно что вы там у себя делали. Покажите лучше код.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 23:12 06-12-2012
    Varenik



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    folta
            Вам надо использовать при чтении не Read, а ReadLn


    ----------
    Если нравится, считайте, что получилось…

    Всего записей: 1766 | Зарегистр. 21-07-2001 | Отправлено: 23:17 06-12-2012
    folta

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    вот. все простенько.
    Подробнее...
    только с процедурой TChar еще не разобрался, так что с прорисовкой графика из массива, это на десерт)
     
    Varenik
    а ни в какую.
    я и в строчку, и в столбик, никак.
    все одно спасибо, понял куда копать.

    Всего записей: 1177 | Зарегистр. 24-11-2010 | Отправлено: 00:20 07-12-2012
    alex1334

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    folta
     invalid numeric input  
     
     У вас похоже ошибка возникает еще на этапе чтения из файла переменной integer.  
    Возможно проблема не в самих числах а в разделителях между числами
     
    SetLength(key, FileSize(f));
     Вероятно этот оператор совершенно неверен. Переменная key имеет тип integer то есть ее длинна 4 байта не зависимо от того какое число она хранит. А вот текстовый файл данные хранит в виде символов ASCII а это значит что число 123 занимает 3 байта а число 1234567 занимает 7 байт. Я уже не говорю про символы разделители в том числе и перевод строки и возврат каретки они тоже занимают место в файле но вообще никакого отношения к числам не имееют. Добавте еще символы разделители между числами

    Всего записей: 148 | Зарегистр. 10-10-2010 | Отправлено: 00:28 07-12-2012 | Исправлено: alex1334, 00:38 07-12-2012
    folta

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    alex1334
    ммм...а я думал что Integer само отделит зерна от плевел целые.
    оно то так, ваш вариант логичен.
    но хотелось бы чтобы из файла извлекалось в массив и даже когда присутствуют явно некорректные символы. а не падало.
    вобщем, завтра буду штудировать, как.

    Всего записей: 1177 | Зарегистр. 24-11-2010 | Отправлено: 00:47 07-12-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    folta
    Для этого есть варианты:
    а) обрамить все try except
    б) использовать процедуру val
    в) использовать ф-цию StrToIntDef
     
    Из всего вышеперечисленного я бы выбрал val

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 09:23 07-12-2012
    folta

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    salexn1
    наверное так некорректно было бы

    Код:
     
    if val = integer then ...
    else ...
     

    а с нагугленным примером никак не могу применить до своей системы

    Код:
     
    a: single;
    b: integer;
    ...
    val(Edit1.Text,a,b);
     

     
    зато разобрался, ну почти разобрался с winAPI способом.
    только кто там отвечает за массив?
    а можно гибрид?...не ржать)
    Подробнее...

    Всего записей: 1177 | Зарегистр. 24-11-2010 | Отправлено: 15:41 07-12-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    folta

    Цитата:
     
     
    if val = integer then ...  
    else ...  
     

     
    это точно фигня...
     

    Цитата:
     
    a: single;  
    b: integer;  
    ...  
    val(Edit1.Text,a,b);  
     

     
    Вы хелпом умеете пользоваться???
     

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 16:21 07-12-2012
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    folta
    А можно пример содержимого файла, а то вдруг он у вас бинарный?

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 16:40 07-12-2012
    folta

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    salexn1
    что имеем:
    drkb3.chm
    www.delphibasics.ru.chm
    если не то тыкаю, намекните.
     
    вот хоть режьте, этот пример для моего случая непонимайн:
    http://www.delphibasics.ru/Val.php
     
    уже умолчу сколько перелистал в вебе.
    да, вот такая трагедия.
     
    Добавлено:
    Frodo_Torbins
    да обыкновенный.
    создаю блокнотом или акелпадом.
    разные. с анси и уни кодировкой.
    вписываю числа. в один строчно и без пробелов, другой столбик и пробелами.
    все одно.
    собственно строка 123456789000
    http://rghost.ru/42069015

    Всего записей: 1177 | Зарегистр. 24-11-2010 | Отправлено: 16:47 07-12-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    folta

    Цитата:
    собственно строка 123456789000

    для 32-битного целого это переполнение...
    или бери поменьше (до 2^32 - 1) или используй 64-разряда, если сидишь на64-дельфях...

    Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 17:17 07-12-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    folta
    Еще есть просто Help.
     
    А что тут непонятного
    Вы скидываете в процедуру текстовый вариант (1-ый параметр), а он пытается привести к тому типу, который вы передаете вторым параметром. 3-ий параметр всегда integer. Если все ОК - то 3-ий параметр = 0, если нет - то покажет ту позицию, где плохое число (точнее не число).

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 17:20 07-12-2012 | Исправлено: salexn1, 17:20 07-12-2012
    folta

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    да нет...32-е у меня...
    собственно, притопал к мысли, что массив из файла надо считывать побайтово..где-то пробегало, но не обратил внимание.
    ладно.
    раз уж нагородил, аппетит приходит во время еды)
    можно задать на открытие любого файла, а не заданного этим?

    Цитата:
     TFileStream.Create(fmOpenRead)

     
     
    Добавлено:
    salexn1
    у меня нету, вырезано к чертям.
    приду, поищу родное и попытаюсь сделать как надо хелпом

    Всего записей: 1177 | Зарегистр. 24-11-2010 | Отправлено: 17:26 07-12-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    folta

    Цитата:
    массив из файла надо считывать побайтово..
    а можно ещё раз задачу озвучить?

    Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 17:30 07-12-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    folta
    Ваш файл какой-то кривой zod.txt который У него кодировка UCS-2 Little Endian!
     
    Мот отсюда проблемы?
    Как только я поменял его в ANSI - все запалило...
    Вот код..

    Код:
     
    var
      S : String;
      i : Integer;
      key: array of Int64;
      value: Int64;
      aTextFile: TextFile;
    begin
      AssignFile(aTextFile, 'c:\zod.txt');
      try
        Reset(aTextFile);
        while not Eof(aTextFile) do
        begin
            Readln(aTextFile, S);
            value := StrToInt64(S);
            Inc(i);
            key[i] := value;
        end;
      finally
        CloseFile(aTextFile);
      end;
     

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 17:32 07-12-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Активные темы » Вопросы по Delphi (до версии 2009) - часть 6


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru