Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > О радиокнопках


Автор: Georg4 15.12.2002, 09:53
Делаю я прогу в ней радиокнопка должна поменять название 42 раза,  ну я беру считываю построчно из текстового файла строки , записываю в массив и элементи массива присваиваю имени кнопки.
Все хорошо, да что-то не выходит!!!!
Помогите!?:;;"**(

Автор: Vit 15.12.2002, 10:02
Типичная ошибка в 13й стоке программы.

Автор: Medved 15.12.2002, 18:15
Да, точно, точку с запятой забыл поставить..... :p

Ну а если серьезно..... ты сказал, что присваиваешь имени радиокнопки, а ты попробуй присваивать не имени, а свойсву Caption....

Автор: Georg4 17.12.2002, 09:08
Да я и так присваиваю Caption только нифига, пашет но при нажатии кнопки Кэпшн пропадает и самое странное когда несколько раз нажимаешь на кнопку(обычную, не радио которой я задаю эту программу) в кэпшене радиокнопки мигают строчни фаила, но только мигают на 0,1 секунды беспоряжочно вобщем бардак полный

Автор: dr.ZmeY 17.12.2002, 09:39
Если ты всё правильно сделал, то ошибки быть не должно... Покажи код...

Автор: dr.ZmeY 17.12.2002, 10:34
Код

...
 private
   { Private declarations }
   rnd              : integer;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation
Const MeS: array [0..7] Of String = ('первый','второй',
                                  'третий','четвёртый',
                                  'пятый','шестой',
                                  'седьмой','ХВАТИТ :)');


{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
rnd:= random (3);
IF rnd= 2 then RadioButton1.Caption:=(mes[random(8)]);
end;
...


Я так понял, ты что то в этом роде хочешь? Я массив сделал, но что мешает из файла читать?

Автор: Medved 18.12.2002, 02:23
Модератор: если хочешь чтобы тебе помогли, приведи отрывок кода, где по твоему мнению может скрываться ошибка

В конце концов, мы же не экстрасенсы, чтобы увидеть, что ты там написал....

Автор: Georg4 18.12.2002, 08:51
Код выглядит приблизительно так

procedure TForm1.Button1Click(Sender: TObject);
var
f1:textfile;
s1:shortstring;
i:integer;
b:array[1..42]of string;
 begin
assignfile(f1,'f1.txt.');
reset(f1);
while not eof (f1) do
for i:=1 to 42 do
   Begin
 readln(f1,s1);
 b[i]:=s1;
radiobutton1.Caption:=s1;
end;
end;

Автор: Medved 18.12.2002, 09:12
Попробуй сделать так, и посмотри, что получиться:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
   f1:textfile;
   s1:shortstring;
   i:integer;
   b:array[1..42]of string;
begin
   assignfile(f1,'f1.txt.');
   reset(f1);
   while not eof (f1) do
   for i:=1 to 42 do
       begin
           readln(f1,s1);
           b[i]:=s1;
           radiobutton1.Caption:=s1;
           ShowMessage(s1);
       end;
end;


я только добавил строчку ShowMessage(s1), после твоей строки radiobutton1.Caption:=s1;


Автор: Vit 18.12.2002, 13:36
Если в файле что-то есть то она у тебя и меняется, только прорисовываться ты ей не даёшь, попробуй так:

Код
procedure TForm1.Button1Click(Sender: TObject);
var
 f1:textfile;
 s1:shortstring;
 i:integer;
 b:array[1..42]of string;
begin
 assignfile(f1,'f1.txt.');
 reset(f1);
 while not eof (f1) do
   for i:=1 to 42 do
     Begin
       readln(f1,s1);
       b[i]:=s1;
       radiobutton1.Caption:=s1;
       application.processmessages;
       sleep(300);
     end;
end;

Автор: neutrino 19.12.2002, 01:14
А может для этой задачи использовать ТStrings? Там есть и функция считывания из файла. Ну, впрочем, можешь делать как Vit сказал, только необязательно в массив записывать эти строки. И зачем цикл в цикле? Или я чего-то не догоняю? Если тебе надо именно 42 строки считать, так применяй for, если все до конца файла, то while not eof(f1) do .......

Автор: Vit 19.12.2002, 04:55
Я не стал оптимизировать код, так как ясно что это просто кусок чего-то и многие строки просто удалены, но если это не так, то конечно же этот кон надо очень существенно переработать в плане оптимизации.

Автор: dr.ZmeY 19.12.2002, 05:36
Я одно не пойму, зачем в массив 42 раза заносить 42-ю строку??? Присвоение данных в массив через двойной цикл, оригинально однако...

Автор: Medved 20.12.2002, 04:35
Цитата

Я одно не пойму, зачем в массив 42 раза заносить 42-ю строку Присвоение данных в массив через двойной цикл, оригинально однако...

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


Автор: dr.ZmeY 20.12.2002, 06:36
Ну я бы предложил бросить на форму memo, и в массив заность через него, а к радиокнопке присваивать значения уже из массива, тогда можно это делать по нажатию кнопки...
Код

procedure TForm1.Button1Click(Sender: TObject);
var
f1:System.Text; s1:shortstring;
i:integer; b:array[0..41]of string;
begin
assignfile(f1,'f1.txt');
reset(f1);
while not eof (f1) do begin
  readln(f1,s1);
  Memo1.Lines.Add(s1);
end; CloseFile(f1);
for i:=0 to 41 do begin
   b[i]:=Memo1.Lines[i];
end;

radiobutton1.Caption:=b[button1.Tag];
button1.Tag:= button1.Tag+1;
if button1.Tag>41 then button1.Tag:=0;
end;

Автор: dr.ZmeY 20.12.2002, 06:36
Хотя код дейсвительно корявый...

Автор: Vit 20.12.2002, 08:37
Цитата(Snick_Y2K @ 19.12.2002, 13:36)
Хотя код дейсвительно корявый...

Вовсе не обязательно, если у человека было написано 200 строк кода, а он решил опубликовать только значимые для данного вопроса строки - то вот и результат, я вполне допускаю, что в оригинале между каждыми 2мя приведенными строками был десяток других и смысл тогда в таком построении мог быть вполне очевидный. Собственно не в корявости дело, код рабочий, визуальный элемент не меняет заголовок только из-за не выполнения прорисовки (сообщений формой)

Автор: dr.ZmeY 21.12.2002, 05:56
РАБОЧИЙ КОД? Vit, ты не прав... Данные файла массиву так не присваиваются, хотя я тоже поленился и сделал это через memo, но всё равно, непонятно чего он хотел записать в массив, но явно не содержимое файла, те решения которые ты с Pegas'ом ему дали, не уверен что таковыми являются, единственное что вы сделали - это дали задержку, чтобы было видно, что капшен радиокнопки меняется, не уверен, что это то что нужно... Плюс он не закрыл файл, понимаю что это не ошибка, но всё же недочёт... Не ты не Pegas, ведать, не пробовали запускать этот код, (хотя я, честно говоря, тоже его не запускал), но код НЕРАБОЧИЙ...

Ладно, не буде превращать топик во флейм, извените....

Автор: Vit 21.12.2002, 09:30
Ну если кто-то ленится, то я нет - не надо меня обвинять в ленности, я взял этот код, откомпиллировал в Delphi5 - всё абсолютно рабочее, всё присваивается, в этом коде формально, ошибок нет! Если он у тебя не работает то хочу услышать конкретное мнение почему? Помимо общей корявости я вижу только 2 существенных прокола этого кода:

1) Не отслеживается конец файла  (если файл содержит больше или меньше 42 строк, то он читать файл будет, но скорее всего не так как хотел автор) - но как я говорил - я не уверен что дополнительные операторы не были стёрты, вот я и не берусь судить правильность результата
2) нет application.processmessages - поэтому не прорисовывается заголовок RadioButton.


2Snick_Y2K: посмотри внимательно на код

По поводу мемо - это тоже очень коряво и не всегда работает:
1) зачем использовать мемо, если для этих целей достаточно TStringList
2) Если файл например 1 гигабайт то ни в мемо ни в  TStringList ты его не загрузишь, а вот построчно загрузить первые 42 строки в массив - запросто.


Автор: dr.ZmeY 21.12.2002, 10:08
В том то и дело, что в массив он грузит 42 раза 42-ю строку (как по твоему это может в двойном цикле нормально записаться), мемо я сам из-за лени вставил, первое что подруку подвернулось. При чем тут application.processmessages и RadioButton.Cарtion? Думаешь он хочет просто на время , чтобы посмотреть что присвоилось? Или он по событию нажатия кнопки хочет изменить капшен... Это мы можем узнать только из уст автора топика...

Автор: dr.ZmeY 21.12.2002, 10:28
Вот вариант без мемо:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
f1:System.Text; s1:shortstring;
i:integer; b:array[0..30]of string;
begin
assignfile(f1,'f1.txt');
reset(f1);
i:=0;
while not eof(f1) do begin
  readln(f1,s1);
  b[i]:=s1;
  i:=i+1;
end; CloseFile(f1);
radiobutton1.Caption:=b[button1.Tag];
button1.Tag:= button1.Tag+1;
if button1.Tag>29 then button1.Tag:=0;
end;

Автор: Medved 26.12.2002, 04:40
Snick_Y2K ты пожалуйста запусти код, который я в начале топика привел, и я думаю все твои вопросы разом снимуться....

Автор: Medved 26.12.2002, 07:10
Цитата
РАБОЧИЙ КОД? Vit, ты не прав... Данные файла массиву так не присваиваются...Не ты не Pegas, ведать, не пробовали запускать этот код, (хотя я, честно говоря, тоже его не запускал), но код НЕРАБОЧИЙ...


Первым делом, что я сделал, прежде чем отвечать и развивать эту тематику, так это скомпилировал и запустил этот  код..... Вы Snick_Y2K меня поражаете......  Как Вы можете так уверенно говорить, что код нерабочий, даже если Вы не пробовали его запускать? Дам Вам одни совет (хотя и не люблю это делать в таких случаях), впредь не пускайтесь в дисскусии, прежде чем не удостоверитесь, что Вы правы.... В этот раз Вы просто выставили себя, не в самом лучшем, для себя свете.....


Автор: Medved 26.12.2002, 07:19
МОДЕРАТОР: Надеюсь больше не будем превращать тему во флейм.... топики по поводу рабочего или нерабочего кода, а так же не относящиеся к заданному вопросу, впредь будут удаляться.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)