Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как укоротить код? 
:(
    Опции темы
Xenos
Дата 1.2.2005, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 1.2.2005

Репутация: нет
Всего: нет



У меня есть такая кнопка
Код

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'у нужное значение?
PM MAIL   Вверх
Zero
Дата 1.2.2005, 03:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



Вообщем брось на форму 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, по известному номеру, определить Символ.
Не поймёш пиши.
PM MAIL ICQ   Вверх
Satana
Дата 1.2.2005, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 564
Регистрация: 15.9.2004
Где: Ставрополь, СЗ ра йон

Репутация: 1
Всего: 5



попробуй так:
[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]

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


--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
Bes
Дата 1.2.2005, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 5
Всего: 7



Сделай кэпшен кнопок буквы и вставляй его вместо параметра. :-)
PM MAIL   Вверх
Snowy
Дата 1.2.2005, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Код

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 одинаковых кода.

PM MAIL   Вверх
Xenos
Дата 1.2.2005, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 1.2.2005

Репутация: нет
Всего: нет



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;

Тоесть (с) для каждой кнопки должен быть разным.
PM MAIL   Вверх
Rennigth
Дата 1.2.2005, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Цитата

[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 вроде, сделай функцию в классе формы


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Snowy
Дата 1.2.2005, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



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

Это сообщение отредактировал(а) Snowy - 1.2.2005, 12:12
PM MAIL   Вверх
Rennigth
Дата 1.2.2005, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



да можно и в tag писать ord от буквы


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Xenos
Дата 1.2.2005, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 1.2.2005

Репутация: нет
Всего: нет



Блин, толи вы меня не понимаете, толи я вас (скорее конечно второе).
На самом деле на каждой кнопке висит вот такой код :
Код
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
Если можно про функцию поподробнее, тоесть как именно это оформить?
PM MAIL   Вверх
Vit
Дата 1.2.2005, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Код

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



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


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Girder
Дата 1.2.2005, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Нифига не понял в чем проблемма... 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;



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Snowy
Дата 2.2.2005, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Все элементарно. Кладешь 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;

Код смотрит какая буква нарисована на кнопке, и проверяет, а есть ли такая в строке.
Вот и все. Код один, кнопок много. Код различает кнопки по надписи, которая на кнопке нарисована.
PM MAIL   Вверх
Satana
Дата 2.2.2005, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 564
Регистрация: 15.9.2004
Где: Ставрополь, СЗ ра йон

Репутация: 1
Всего: 5



Snowy Ну в принципе та же фигня что и я написал только красивее smile


--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
Snowy
Дата 2.2.2005, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Вот нарисовал твое "Поле Чудес". Можешь взять за основу. Переделать конечно придется, поскольку я все запихал в 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.


Это сообщение отредактировал(а) Snowy - 2.2.2005, 14:23
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0743 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.