Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Вниз

Распределение строк по 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.049 c
8-1088633422
xam
2004-07-01 02:10
2004.09.26
Документация Lame по русски


6-1090140794
Скив
2004-07-18 12:53
2004.09.26
Нажать "Submit"


3-1093424056
IGray
2004-08-25 12:54
2004.09.26
Посоветуйте плиз DBGrid с мультиселектом и сортировкой


14-1094741972
X9
2004-09-09 18:59
2004.09.26
Философия


1-1094656072
hgd
2004-09-08 19:07
2004.09.26
Как получить время текущее с милисекундами?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский