Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

Распределение строк по captions   Найти похожие ветки 

 
Garfunkel   (2004-09-08 16:43) [0]

Есть текстовый файл с четырьмя строками. На форме есть 4 кнопки. Требуется:
при загрузке программы считывать эти строки и СЛУЧАЙНЫМ ОБРАЗОМ распределить их по captions этих четырех кнопок. Например, button1.caption:=3-ая строка, button2.caption:=1-ая строка... и.т.д. Причем чтобы каждый раз распределение было разным. Помогите, пожалуйста!


 
Digitman ©   (2004-09-08 16:46) [1]


> Помогите, пожалуйста!


т.е. написать за тебя программу .. а ты будешь сидеть и в носу ковырять, ожидая готовенькое ...

так что ли ?


 
Ega23 ©   (2004-09-08 16:51) [2]

AssignFile
ReadLn
CloseFile

или

List:=TStringList.Create
List.LoadFromFile()
List.Free

потом ещё

Randomize
Random

Button1.Caption:=...

Ну и самое главное:  F1


 
Cosinus ©   (2004-09-08 16:51) [3]

Randomize+F1


 
Чайник   (2004-09-08 17:01) [4]

var
f:Textfile;
s:tstrings;
i:integer;
begin
assignfile("....",f);
reset(f);
s:=tstrings.create;
s.loadfromfile(...);
randomize;
i:=random(4);
button1.caption:=s.strings[i-1];
s.delete(i-1);
i:=random(3);
button2.caption:=s.strings[i-1];
s.delete(i-1);
i:=random(2);
button3.caption:=s.strings[i-1];
s.delete(i-1);
button1.caption:=s.strings[0];
s.delete(0);
end;
end;


 
Чайник   (2004-09-08 17:01) [5]

ну и closefile соответственно


 
Ega23 ©   (2004-09-08 17:11) [6]

Гы, а нафига тогда AssignFile и reset(F)?

ну и closefile соответственно ?


 
Cosinus ©   (2004-09-08 18:34) [7]

>>Чайник   (08.09.04 17:01) [4]
А в цикл чего не запихал?


 
Чайник   (2004-09-08 18:39) [8]

а в цикле кнопки неудобно перебирать :)


 
Cosinus ©   (2004-09-08 19:30) [9]

Мне кажется, что так правильнее будет...

procedure TForm1.SetCaptions;
var
  i: integer;
  Component: TComponent;
  ListCount: byte;
  s: TStrings;
  N: byte;
begin
  s:=TStrings.Create;
  s.LoadFromFile(...);
  ListCount:=S.Count-1;
  for i := 0 to ComponentCount - 1 do
  begin
    Component := Components[i];
    if (Component is TButton) then
      if (Component as TButton).tag=$10 then
      begin
        N:=Random(ListCount);
        (Component as TButton).Caption:=s.Strings[N];
        s.Delete(i);
        dec(ListCount);
      end;
  end;
  s.Free;
end;


 
Чайник   (2004-09-08 19:31) [10]

:)) можно и так, но мне тот код прост попроще показался...


 
Cosinus ©   (2004-09-08 19:32) [11]

Зато универсальности на порядок больше...
Да и повеселее он как то :))))


 
Cosinus ©   (2004-09-08 19:34) [12]

Кстати вопрос к автору. А зачем это надо то??? Я вот, честно, так и не придумал не одной задачи, для которой надо бы было так извращться.


 
Чайник   (2004-09-08 20:21) [13]

Гы :)) а вопрос то интересный... :)


 
Garfunkel   (2004-09-09 00:07) [14]

Не подходят к сожалению ваши ответы. LoadFromFile загружает ВЕСЬ файл. А мне надо считывать по 4 строки, потом из них считывать допустим в stringlist и уже оттуда назначать наугад четырем кнопкам captions. Потом все повторяется - опять 4 строки и.т.д... Это надо для тестовой игры типа Миллионер. Чтобы вопросы каждый раз шли наугад а не так как записано в файлах вопроса.


 
wl   (2004-09-09 00:17) [15]

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


 
Александр1   (2004-09-09 08:09) [16]


> Garfunkel   (09.09.04 00:07) [14]

Слушай я тут недавно почти с тем же самым мучился. Я пешу программу тестирование для студентов. Мне надо было считать из файла строки и распределить их по редакторам Memo. Ну в смысле в файле записаны вопрос и варианты ответа. Я долго мучился с этой проблемой. Пока всё таки через две недели решил её даже двумя способами.
{1-й способ}
var
MemoArray: array [1..3] of TMemo;
  s:string;
........
procedure TForm1.BitBtn2Click(Sender: TObject);
var F:TextFile; I:integer;//когда I локальна, будет чуть быстрее
begin
MemoArray[1] := Memo1;
MemoArray[2] := Memo2;
MemoArray[3] := Memo3;

AssignFile(F, ExtractFilePath(Application.ExeName)+"vopr\1.vop");
Reset(F);
I := 1;
repeat
ReadLn(f, S);
if S <> "" then MemoArray[i].Lines.Add(S)
else I := I + 1;
until Eof(F);
CloseFile(F);

end;

{2-й способ}
procedure TForm1.BitBtn3Click(Sender: TObject);
const AnzahlMemo = 7; {колличество Memo на форме}
var Datei: TextFile;
  TmpStr: string;
  MatrixMemo: array[0..AnzahlMemo - 1] of TMemo;
  i, NumMemo: integer;
begin
NumMemo := AnzahlMemo - 1;
for i := ComponentCount - 1 downto 0 do
  if Components[i] is TMemo then
  begin
    MatrixMemo[NumMemo] := Components[i] as TMemo;
    Dec(NumMemo);
  end;

  if NumMemo < -1 then exit; {выход, если к-во Memo на форме больше, чем в AnzahlMemo}

NumMemo := 0;
AssignFile(Datei, ExtractFilePath(Application.ExeName)+"vopr\1.vop");
Reset(Datei);
try
  while not Eof(Datei) do
  begin
    ReadLn(Datei, TmpStr);
    if (Length(TmpStr) > 0) and
              ((TmpStr[1] <> "") or (TmpStr[1] <> " ")) then
      MatrixMemo[NumMemo].Lines.Add(TmpStr)
    else
     Inc(NumMemo);

    if NumMemo >= AnzahlMemo then Break;
  end;
finally
  CloseFile(Datei);
end;

end;


> Чтобы вопросы каждый раз шли наугад а не так как записано
> в файлах вопроса.


Ну я бы это вопрос когда пешу программу тестирования решаю так. Это может немного не удобно. Но у меня в принципе и вопросов обычно не так много. И храню я их в отдельной папки. Хотя тогда писал программу слабое звено и русскую рулетку, так там у меня было по 500 вопросов. Короче я создаю столько файлов, сколько вопросов. Например 1.vop, 2.vop  и т.д. А потом пешу что-то вроде этого
AssignFile(F, ExtractFilePath(Application.ExeName)+"vopr"\+ IntToStr(v)+.vop");
……….
Где v:=random(50);
Не забудь включить счётчик случайных чисел  Randomize;

Да ещё кстати хотел сказать. Чтобы в процессе твоей игры пользователи не запоминали варианты ответов (т.е. номера вариантов ответа), можно например сделать так, чтобы варианты ответа менялись местами. Даже если попадается такой вопрос, который уже был у него порядок вариантов ответа будет другой и поэтому вопрос вроде как и старый, а ответ на него не всегда и вспомнишь. Ну этого проще всего достичь сменой координат у носителя варианта ответа. Например в моём случае таким носителем является Memo1,2,3,4.
Соответственно можно их менять местами изменяя их координаты Memo1.Left:=368; Memo1.Top:=72; Перестановку Memo можно тоже поставить на random.


 
Чайник   (2004-09-09 10:03) [17]

А тебе первые 4 строки надо или неважно какие?


 
Cosinus ©   (2004-09-09 12:05) [18]

>>Чайник   (09.09.04 10:03) [17]
Да какая разница то? Плюс\минус две строчки.
Кстати, по-моему, тот алгоритм, который я написал элементарно изменить под нужную задачу.


 
Garfunkel   (2004-09-09 13:36) [19]

Мой текстовый файл вопросов и ответов состоит из блоков, блоки по 4 ответа на один вопрос. Один блок выглядит так:
--------------------------------------

Вопрос
Ответ 1
1 // 1= верный ответ, 0=неверный ответ
Ответ 2
0
Ответ 3
0
Ответ 4
0

------------------------------------

Я нашел решение проблемы таким путем :

....
var
 button:Array[1..4]of TButton;
 correct:string;
......

procedure TForm1.LoadQuestion;
var
 str:string;
 s:TStringList;
 i,x:Byte;
begin
 Randomize;
 s:=TStringList.Create;
 for i:=1 to 4 do
 begin
   ReadLn(f,str);
   s.Add(str);
   ReadLn(f,str);
   if str="1" then correct:=s.Strings[i-1]; // считывание строк с цифрами 1/0
 end;
 for i:=0 to 3 do
 begin
   x:=Random(s.Count);
   button[i+1].Caption:=s.Strings[x];
   s.Delete(x);
 end;
 s.Free;
end;
-------------------------------------------
но может есть более изящный путь решения? Всем спасибо за помощь!



Страницы: 1 вся ветка

Текущий архив: 2004.09.26;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.042 c
6-1090224937
Sky
2004-07-19 12:15
2004.09.26
DHTML компонента


1-1094716363
BPK
2004-09-09 11:52
2004.09.26
Нужно отобразить HTML


1-1094619109
DelphiN!
2004-09-08 08:51
2004.09.26
Формирование Меню по списку файлов и папок


3-1093861687
Л1
2004-08-30 14:28
2004.09.26
Как сделать свое сообщение на ошибку при отсутствии БД


1-1095016396
bloodman
2004-09-12 23:13
2004.09.26
Возможно ли изменение состояния кнопки ?