Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2019, 18:55   #1
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
Смех Как установить процедуру в onclick динамической кнопки?

Доброе время года друзья, есть вопрос. Работаю с делфи отвремени особо не изучая. Так что простите. Вопрос состоит в том что у меня есть INI файл с содержанием
Код:
[Buttons]
NumberName1=Кнопка1
Number1=ert.exe
NumberName2=Программа для определения точности
Number2=bin/wloer.exe
SizeW=220
SizeH=35
TopB=40
LeftB=220
А так же у меня создаются кнопки динамически сколько позиций в INI файле столько и кнопок
Код:

var
but: Array[1..7] of TButton;
IniF: TIniFile;

...
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
IniF := TIniFile.Create(ExtractFilePath(ParamStr(0)) + '/bin/confile.inig'); //читаю ini
for i := 1 to Length(But) do
begin
  But[i] := TButton.Create(Self);
  But[i].Parent := Self;
  with IniF do begin
  But[i].top := Strtoint(iniF.ReadString('Buttons', 'TopB', ''))*i; //4 строки размеры кнопки и позиция
  But[i].Left:= Strtoint(iniF.ReadString('Buttons', 'LeftB', ''));
  But[i].Width := Strtoint(iniF.ReadString('Buttons', 'SizeW', ''));
  But[i].Height:= Strtoint(iniF.ReadString('Buttons', 'SizeH', ''));
  but[i].name:='Buttons'+inttostr(i);
  but[i].tag:=i;
  but[i].TabOrder:=i;
  param:=inttostr(i);
  But[i].OnClick := Butt_click;
  But[i].Caption := iniF.ReadString('Buttons', 'NumberName'+inttostr(i), '');
  end;
end;
end;
У меня проблема передать имя файла в процедуру Butt_click и чтобы при нажатии на кнопку файл открылся..
ЧТО Я ДЕЛАЮ НЕПРАВИЛЬНО. А это точно, что неправильно.
вот и процедура
Код:
procedure TForm1.Butt_click(Sender: TObject);
var st, names: string;
begin
if Sender is TButton then
begin
IniF := TIniFile.Create(ExtractFilePath(ParamStr(0)) + '/bin/confile.inig');
if FileExists(iniF.ReadString('Buttons', 'Number'+inttostr(TButton(Sender).Tag), '')) then
begin
Memo2.Lines.Add(TButton(Sender).Caption);
names:=iniF.ReadString('Buttons', 'Number'+inttostr(TButton(Sender).Tag), '');
ShellExecute(Form1.Handle, 'open', pchar(ExtractFilePath(ParamStr(0)) + names), nil, nil, SW_SHOWNORMAL);
 end
  else
  st:= iniF.ReadString('NameFile', 'Site', '');
  ShowMessage('файла нет ');
end;
end;
Помог, нажми весы слева
grafgrial вне форума Ответить с цитированием
Старый 29.01.2019, 22:31   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
А это точно, что неправильно.
непонято в чем проявляется НЕ ТАК.
----

Но можно и так
1. рядом с кнопками хранить и путь к файлу для ЭТОЙ кнопки
Код:
but: array [1..7] of record btn: Tbutton; f: TFileName; end;
2. при создании
Код:
for i:=1 to 7 do begin
 r:=TButton.Create(self);
 r.....//делаем кнопку
  r.top := Strtoint(iniF.ReadStringInteger('Buttons', 'TopB', 0))*i; //4 строки размеры кнопки и позиция
  r.Left:= iniF.ReadInteger('Buttons', 'LeftB', 0);
  r.Width := iniF.ReadInteger('Buttons', 'SizeW', '');
  r.Height:= iniF.ReadInteger('Buttons', 'SizeH', '');
 ...
 but[i].btn:=r; // запомнили саму кнопку
 but[i].f:=inif.ReadString(...); // и то самое имя файла из ini-файла
end;
3. и используем при "нажатии"
Код:
for i:=1 to 7 do begin
  if but[i].btn =sender then begin // нажата та самая 
    //что-то делаем c but[i].f //  тем самым файлом
    break; // дальше проверять бессмысленно
  end;
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 29.01.2019 в 22:39.
evg_m вне форума Ответить с цитированием
Старый 31.01.2019, 11:15   #3
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
непонято в чем проявляется НЕ ТАК.
в том что у меня не открывается файл. либо не удается его имя передать..

Насчет ".ReadInteger" да тупанул, давно работал с delphi

Обязательно попробую ваш способ, позже отпишусь
Помог, нажми весы слева
grafgrial вне форума Ответить с цитированием
Старый 31.01.2019, 11:36   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Код:
if FileExists(iniF.ReadString('Buttons', 'Number'+inttostr(TButton(Sender).Tag), '')) 
....
ShellExecute(Form1.Handle, 'open', pchar(ExtractFilePath(ParamStr(0)) + names), nil, nil, SW_SHOWNORMAL);
проверяется и открывается вообще говоря ДВА РАЗНЫХ файла.
проверка в ТЕКУЩЕЙ а открытие по АБСОЛЮТНОМУ (и не факт что совпадающему) пути.
читайте GetCurrentDir
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 31.01.2019, 20:11   #5
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
проверяется и открывается вообще говоря ДВА РАЗНЫХ файла
Да не я там несколько часов пытался разными способами протолкнуть)))

Спасибо все отлично работает, лайкосик заслужен

вот если что код он работает у меня (delphi7) Может кто-то не додумается как все соединить
Код:
var
  Form1: TForm1;
  IniF: TIniFile;
  i: Integer;
  But: array [1..7] of record btn: Tbutton; f: TFileName; end;


procedure TForm1.Butt_click(Sender: TObject);
begin
for i:=1 to 7 do begin
  if but[i].btn =sender then begin
ShellExecute(Form1.Handle, 'open', pchar(but[i].f), nil, nil, SW_SHOWNORMAL);
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
W, H: Word;
jpg: TJPEGImage;
r:TButton;
begin
IniF := TIniFile.Create(ExtractFilePath(ParamStr(0)) + '\bin\confile.ini');
for i := 1 to Length(But) do
begin
  r:=TButton.Create(self);
  r.Parent:=self;
  with IniF do begin
  r.top := Strtoint(iniF.ReadString('Buttons', 'TopB', ''))*i;
  r.Left:= Strtoint(iniF.ReadString('Buttons', 'LeftB', ''));
  r.Width := Strtoint(iniF.ReadString('Buttons', 'SizeW', ''));
  r.Height:= Strtoint(iniF.ReadString('Buttons', 'SizeH', ''));
  r.name:='buttons'+inttostr(i);
  r.tag:=i;
  r.TabOrder:=i;
  r.Caption := iniF.ReadString('Buttons', 'NumberName'+inttostr(i), '');
  r.OnClick := Butt_click;
  but[i].btn:=r;
  but[i].f:=ExtractFilePath(ParamStr(0)) +'drivers\'+(iniF.ReadString('Buttons', 'Number'+inttostr(i), ''));
  end;
end;
end;
Помог, нажми весы слева

Последний раз редактировалось grafgrial; 31.01.2019 в 20:29.
grafgrial вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать чтоб при нажатии кнопки Enter на клавиатуре - button реагировала на событие onClick scorer123 Помощь студентам 3 27.06.2015 21:09
как вызвать в процедуре OnClick другую процедуру OnClick ? ddiipp Компоненты Delphi 7 07.09.2013 16:07
Как установить положение кнопки на странице Cyborg HTML и CSS 1 01.11.2010 16:13
Как изменить цвет шрифта кнопки + объявление OnClick Yury Общие вопросы Delphi 7 04.05.2007 04:55