Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с загрузкой текста из файла. [D7, WinME]


Страницы:   1 2

avi ©   (2005-01-11 18:38:00) 

Уважаемые мастера помогите мне плс.Для загрузки текста в Label я
использую этот код:
var f: textfile;
  s: string;
  i: integer;
begin
  Label2.Tag := 31;
Timer1.Enabled := True;
  assignfile(f,'...\questions.DAT');
  reset(f);
  i := 0;
  s := '';
  while not eof(f) do
   begin
     inc(i);
     readln(f,s);
     case i of
        6: Label1.Caption := s;
        7: Label1.Caption :=s;
        8: Label1.Caption :=s;
        9: Label1.Caption :=s;
        10: Label1.Caption :=s;
     end;

   end;
  closefile(f)

но в файле на против некоторых строчек есть знак * мне надо что бы при загрузки текста звезда не загружалась.
Зарание спасибо.


avi   (2005-01-12 18:15:00) [1]

Все разобралс Как сделать так что бы после нажатия на Label программа проверила есть ли в этой строке знак * и если есть то в лабел должна загрузиться 6 или 11 или 18 строка из файла.
А к стати begin...end подкинул хорошию идею как сделать так что бы после каждого запуска в Label1,Label2,Label3,Label3,Label5 загружались разные строчки причем если в Label1 загружена 1 строка в Label2 должна быть 2 в лабел3 3 и т.д. а если в лабел 1 загружена 6 строчка в лабел2 должна загрузиться 7.


avi   (2005-01-12 16:46:00) [2]

begin...end ©
>Это не Вы ли делаете программу "Кто хочет стать миллионером?"?
Нет, но может потом сделаю.


raidan   (2005-01-12 16:36:00) [3]

Не проще ли подгрузить файлик в memo, если он не слишком большой?
А потом указывайте на здоровье - 8, 9, или 15-я строчка...


MetalFan   (2005-01-12 15:50:00) [4]

думай avi думай! не все же тебе будут всегда расжевывать!
запомни в Tag'е label'a номер строки и грузи потом ее...


begin...end   (2005-01-12 15:48:00) [5]

> [20] avi   (12.01.05 15:46)

Так, что-то у меня возникли подозрения.
Это не Вы ли делаете программу "Кто хочет стать миллионером?"?


avi   (2005-01-12 15:46:00) [6]

Я понимаю что я итак много просил но этот вопрос будит последним.
Как сделать так что бы после нажатия на Label программа проверила есть ли в этой строке знак * и если есть то в лабел должна загрузиться 6 или 11 или 18 строка из файла.


Orc   (2005-01-12 08:11:00) [7]


> А откуда Вы знаете, сколько там строк? Может быть, меньше
> 9? В этом случае мой код сработает, хотя и плохо, а Ваш,
> вероятно, вызовет ошибку.

Посчитать строки в файле и все дела:

function filestr(filename:string):integer;
var
 q:integer;
 s:string;
 f:textfile;
begin
 assignfile(f,filename);
 reset(f);
 q:=0;
 while not eof(f) do
 begin
 readln(f,s);
 q:=q+1;
 end;
 closefile(f);
 result:=q;
end;


begin...end   (2005-01-12 08:02:00) [8]

> [17] Anatoly Podgoretsky ©   (11.01.05 22:31)

> Нет никакой нужды присваивать значение ярлыку в цикле ,
> если используется только последнее значение.

Это я понял, и уже давно.

> Теперь то согласен?

После выполнения кода автора ветки из [0] в Label1.Caption окажется либо последняя строка файла (если количество строк там меньше 10), либо 10-я строка (если количество строк там больше или равно 10).

Поэтому с последним вариантом Вашего кода ([17], вторая часть) я согласен.


Anatoly Podgoretsky   (2005-01-11 22:31:00) [9]

fА вот отсюда
 while not eof(f) do
  begin
    inc(i);
    readln(f,s);
    case i of
       6: Label1.Caption := s;
       7: Label1.Caption :=s;
       8: Label1.Caption :=s;
       9: Label1.Caption :=s;
       10: Label1.Caption :=s;
    end;

  end;
 closefile(f)


Первые 9 строк читаются вхолостую, действует результат чтения только последней 10 строки, затем файл закрывается.
Или ты имеешь в виду, что его код занимается подсчетом количества строк?
Тогда так

while not EOF(F) do
begin
Inc(I);
ReadLn(S);
if I = 10 Break;
end;
Label1.Caption := StringReplaces(S, '*', '', [rfReplaceAll])

Нет никакой нужды присваивать значение ярлыку в цикле , если используется только последнее значение. Вот теперь сработает при количестве строк от 0 до бесконечности и будет только одно присваивание, ьещ использования ненужного сдесь множества.
Теперь то согласен?


begin...end   (2005-01-11 21:23:00) [10]

> [15] Anatoly Podgoretsky ©   (11.01.05 21:15)

> for I := 1 to 9 do RealLn(F);
> ReadLn(F, S);

А откуда Вы знаете, сколько там строк? Может быть, меньше 9? В этом случае мой код сработает, хотя и плохо, а Ваш, вероятно, вызовет ошибку.


Anatoly Podgoretsky   (2005-01-11 21:15:00) [11]

begin...end ©   (11.01.05 18:44) [4]
то тоже плохой код!

for I := 1 to 9 do RealLn(F);
ReadLn(F, S);
Label1.Caption := StringReplace(S, '*', '', [rfReplaceAll])


Alexander Panov   (2005-01-11 19:03:00) [12]

avi   (11.01.05 18:56) [12]
если ReadLn(s)  заменить на ReadLn(s); то всё работает.


Супер-)


avi   (2005-01-11 18:58:00) [13]

Всё работает, огромное спасибо тем кто помог.


avi   (2005-01-11 18:56:00) [14]

если ReadLn(s)  заменить на ReadLn(s); то всё работает.


begin...end   (2005-01-11 18:55:00) [15]

> [9] avi   (11.01.05 18:53)

ReadLn(F, S), извините.


Ega23   (2005-01-11 18:55:00) [16]

ReadLn(F,s)


avi   (2005-01-11 18:53:00) [17]

Сново ошибка на этот раз рунается на ReadLn(s) и пишет I/O error 104.


avi   (2005-01-11 18:50:00) [18]

Огромное Всем спасибо!


begin...end   (2005-01-11 18:47:00) [19]

> [4] begin...end ©   (11.01.05 18:44)

Я опечатался: вместо StringReplaces нужно StringReplace.


olookin   (2005-01-11 18:47:00) [20]

[5] avi   (11.01.05 18:46)

Значит, StringReplace, я вечно путаю...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо