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


Автор: Xenos 1.2.2005, 01:12
У меня есть такая кнопка
Код

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
for i:=1 to length(z) do
if z[i]='а' then
(FindComponent(Format('Panel%d',[i])) as TPanel).caption:='А';
end;

и еще 32 такие же кнопки от Б до Я. Так вот, как сделать так, что б написать этот код только раз, заменив 'а' на какой-нить char , а на onClick каждой кнопки просто присваивать char'у нужное значение?

Автор: Zero 1.2.2005, 03:06
Вообщем брось на форму 2 едита, и кнопку, а на неё такой код:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
 //"+" - для обратной замены (A -> a)
 edit2.Text:=chr(ord(edit1.Text[1])-32);
end;
То что будет в edit1, маленьким шрифтом, то в Edit2 большим. Точнее, я этим примером хотел показать, как с помощью функций ORD и CHR, переводить символы.
Я пологаю у тебя Z - это массив состоящий из 33 элементов, тогда тебе надо с помощью функции ORD, определить номер i, затем переприсвоить
Код

i:=i-32  //Разница в таблице ASCII, меду заглавными и строчными символами
А в конце с помощью функции CHR, по известному номеру, определить Символ.
Не поймёш пиши.

Автор: Satana 1.2.2005, 08:25
попробуй так:
[cod=delphi]
procedure chhar(str:char);
var i:integer;
begin
for i:=1 to length(z) do
if z[i]=str then
(FindComponent(Format('Panel%d',[i])) as TPanel).caption:=AnsiUpperCase(str);
[/cod]

и затем в процедуре обработчике будешь вызывть эту с параметром буквы

Автор: Bes 1.2.2005, 08:56
Сделай кэпшен кнопок буквы и вставляй его вместо параметра. :-)

Автор: Snowy 1.2.2005, 09:45
Код

procedure TForm1.ButtonClick(Sender: TObject);
var
 i: integer;
 s: string;
begin
 s:=AnsiUpperCase(z); // чтобы буковки стали большими
 for i:=1 to length(s) do
   (FindComponent(Format('Panel%d',[i])) as TPanel).caption:=s[i];
end;

Для каждой кнопки событие OnClick пропиши не автоматом, а ручками.
Вместо Button1Click, Button2Click и т.д. пиши руками просто ButtonClick. Тогда на все кнопки будет вызываться одно событие и не нужно писать 33 одинаковых кода.

Автор: Xenos 1.2.2005, 11:29
Zero
Ты немного не понял z:string, и моя задача не перевод из одного регистра в другой, а прверка наличия в z определенной букввы, соответственно для каждой копки, тость для Button1.caption='А' проверяет наличие в z 'а' ,и так каждая кнопка, тоесть Button2.caption='Б' наличие 'б' и т.д. В Z буквы по умолчанию нижнего регистра, хотя можно сделать и верхнего, это безразницы что искать.
Satana
Thnx, так уже пробовал только вот как с этим справиться
Код
[Error] Unit1.pas(150): E2003 Undeclared identifier: 'FindComponent'

не знаю. Эта ошибка вылазит в
Код
procedure chhar(str:char);
var i:integer;
begin
for i:=1 to length(z) do
if z[i]=str then
(FindComponent(Format('Panel%d',[i])) as TPanel).caption:=AnsiUpperCase(str);// Вот в этой строчке
end;

Bes
caption кнопок и так буквы, только как это к делу относится, это не укорачивание а удлиннение получится.
Snowy
Нет так не выйдет, я бы мог и просто в свойствах каждой на onclick прописать Button1.click, ну или на крайняк завести какую-нить левую кнопку и спихнуть все на неё, но проблема в том, что для каждой кнопки должно быть что то типа этого
Код
procedure TForm1.ButtonClick(Sender: TObject);
var i:integer;
с:char;
begin
for i:=1 to length(z) do
if z[i]=c then //где с - искомый символ
(FindComponent(Format('Panel%d',[i])) as TPanel).caption:=c;
end;

Тоесть (с) для каждой кнопки должен быть разным.

Автор: Rennigth 1.2.2005, 11:44
Цитата

[Error] Unit1.pas(150): E2003 Undeclared identifier: 'FindComponent'
не знаю. Эта ошибка вылазит в
Код 
procedure chhar(str:char);
var i:integer;
begin
for i:=1 to length(z) do
if z[i]=str then
(FindComponent(Format('Panel%d',[i])) as TPanel).caption:=AnsiUpperCase(str);// Вот в этой строчке
end;


у тебя Classes прописан в Uses?
Добавлено @ 11:47
сорри, findcomponent это метод Tcomponent вроде, сделай функцию в классе формы

Автор: Snowy 1.2.2005, 12:08
Тоже мне проблема. Задай каждой кнопке в каптион свою буковку и по буковке проверяй.
Если не хочешь, чтобы буковку было видно, спрячь буковку в Hint и проверяй по хинту.
Тогда c:=TButton(Sender).Hint

Автор: Rennigth 1.2.2005, 12:35
да можно и в tag писать ord от буквы

Автор: Xenos 1.2.2005, 19:31
Блин, толи вы меня не понимаете, толи я вас (скорее конечно второе).
На самом деле на каждой кнопке висит вот такой код :
Код
procedure TForm1.Button{какой-то}Click(Sender: TObject);
var i:integer;
begin
if q=0 then edit1.Text:='{не важно}';
if p=1 then
begin
for i:=1 to length(z) do
if z[i]='{искомая буква}' then
begin
p:=p+1;
(FindComponent(Format('Panel%d',[i])) as TPanel).caption:='{искомая буква}';
end;
if p=1 then
edit1.Text:='таких букв нет'
else if p=2 then
edit1.Text:='такая буква есть'
else  edit1.Text:='такая буква есть, и не одна';
end;
p:=0;
end;

я сначала его специально урезал и поместил в пост только основную его часть, чтоб никого не путать. Мне всеравно по чему искать по hint'у или по caption'у или по тагу. Мне не хочется всю эту хфигню 33 раза переписать. Я хотел вместо всего верхнего кода на каждую кнопку повесить что то типа этого:
Код
procedure TForm1.Button{какой-то}Click(Sender: TObject);
begin
{char}:={искомая для данной кнопки буква};
//а дальше только вызов procedure или function которая бы выполняла весь верхний код, но с char или tag или hint этой кнопки


Rennigth
Если можно про функцию поподробнее, тоесть как именно это оформить?

Автор: Vit 1.2.2005, 19:51
Код

procedure TForm1.Button{какой-то}Click(Sender: TObject);
begin
{char}:=(Sender as TButton).caption;



(Sender as TButton).caption; - это тект той кнопки которая была нажата

Автор: Girder 1.2.2005, 20:12
Нифига не понял в чем проблемма... smile

Может енто... smile
Код
procedure TForm1.ButtonClick(Sender: TObject);
begin
if (Sender is TButton) then
 Caption:='Буква: '+chr((Sender as TButton).Tag mod 256);
end;

procedure TForm1.FormCreate(Sender: TObject);
var i,j:integer;
   s:string;
begin
s:='ыаыдлроц'; //Какие-то буквы для заполнения
for i:=0 to ComponentCount-1 do
 if (Components[i] is TButton) then
  begin
   j:=(i mod Length(s))+1;
   (Components[i] as TButton).Tag:=ord(s[j]);
   (Components[i] as TButton).OnClick:=ButtonClick;
   (Components[i] as TButton).Caption:=s[j];
  end;
end;

Автор: Snowy 2.2.2005, 09:31
Все элементарно. Кладешь 33 кнопки. На каждой кнопке написана ее буква (только одна буква!). (буква на кнопе соответственно прописана в свойстве Caption). У аждой кнопки также есть событие OnClick. В него ручками нужно прописать ButtonClick, а не назначать по умолчанию, чтобы все кнопки при нажатии вызывали одно и то же событие, а не каждая кнопка свое.
Далее. Жмем на любую из кнопок. Запускается следующий код:
Код

procedure TForm1.ButtonClick(Sender: TObject);
var
 i: integer;
begin
 for i:=1 to length(s) do
   if z[i]=TButton(Sender).Caption then
    (FindComponent(Format('Panel%d',[i])) as TPanel).caption:=s[i];
end;

Код смотрит какая буква нарисована на кнопке, и проверяет, а есть ли такая в строке.
Вот и все. Код один, кнопок много. Код различает кнопки по надписи, которая на кнопке нарисована.

Автор: Satana 2.2.2005, 09:33
Snowy Ну в принципе та же фигня что и я написал только красивее smile

Автор: Snowy 2.2.2005, 14:21
Вот нарисовал твое "Поле Чудес". Можешь взять за основу. Переделать конечно придется, поскольку я все запихал в OnCreate и ничего не уничтожал. Но саму идею отсюда понять сможешь.
Привожу только Unit1, т.к. dpr стандартный. На форму тоже клаcть ничего не нужно - оставь стандартную. Просто создай новый проект и замени весь код Unit1 на этот:
Код

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,  StdCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure ButtonClick(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 z: string='ДИПЛОДОК'; // загаданное слово

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i,x,sz: integer;
begin
 x:=4; sz:=20;
 for i:=1 to 32 do // создаем кнопки
 with TButton.Create(Self) do begin
   ParentWindow:=Self.Handle;
   OnClick:=ButtonClick;
   Top:=8; Left:=x; Width:=sz; Height:=sz; x:=x+sz+1;
   Caption:=chr(191+i);
   Enabled:=true; Show;
 end;
 x:=8; sz:=32;
 for i:=1 to Length(z) do // создаем панельки
 with TPanel.Create(Self) do begin
   ParentWindow:=Self.Handle;
   Name:=Format('Panel%d',[i]);
   Caption:='';
   Top:=40; Left:=x; Width:=sz; Height:=sz; x:=x+sz+8;
   Enabled:=true; Show;
 end;
end;

// ниже код кнопки, который я выкладывал выше
procedure TForm1.ButtonClick(Sender: TObject);
var
 i: integer;
begin
 for i:=1 to length(z) do
   if z[i]=TButton(Sender).Caption then
    (FindComponent(Format('Panel%d',[i])) as TPanel).caption:=z[i];
 TButton(Sender).Hide; // добавил только эту строчку, чтобы кнопка пропадала при выборе
end;

end.

Автор: Xenos 3.2.2005, 00:17
smile smile smile smile
Работает!!!

Snowy smile
работает Perfect
Код

procedure TForm1.ButtonClick(Sender: TObject);
var
 i: integer;
begin
 for i:=1 to length(s) do
   if z[i]=TButton(Sender).Caption then
    (FindComponent(Format('Panel%d',[i])) as TPanel).caption:=TButton(Sender).Caption;
end;

За "Поле Чудес" тоже спасибо, но у мня там все немного сложнее.

smile ВСЕМ огромный THNX и вечный respect. smile


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