Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.12.2012, 22:58
Taemin Taemin вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 45
Репутация: 10
По умолчанию Запуск одной процедуры из другой + работа с номерами компонентов

1) Суть программы предельно проста – запустить из одной процедуры другую процедуру. В результате планировалось увидеть окошко со значением переменной С, но не получилось… видимо procedure Proc1 так и не была вызвана. В чем ошибка?

Код:
...
type
  myproc = procedure;stdcall;
...
var
  Form1: TForm1;
  a : String;
...
procedure Proc1;
var
  b,c: Integer;
  d: string;
begin
b:=22;
c:=StrToInt(a)+b;
ShowMessage(IntToStr(c));
end;

procedure TForm1.btn2Click(Sender: TObject);
var
  p:myproc;
  h:HWND;
begin
 if edt1.Text <> '' then
    begin
    a:=edt1.Text;
    lbl1.Caption:=a;
    @p := GetProcAddress(h,'Proc1');
    end
 else
lbl1.Caption:='pusto';
end;

2) Как реализовать в Delphi что-то подобное?

Код:
procedure TForm1.btn1Click(Sender: TObject);
var
  i : Integer;
begin
i := 1;
edt[i].Text := 'парам-пам-пам';
end;
Ответить с цитированием
  #2  
Старый 20.12.2012, 23:02
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Что это за изврат под первым пунктом?

Тем более, что тип myproc у тебя stdcall, а proc1 - fastcall, ошибка же будет, если параметризуешь.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 20.12.2012, 23:03
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Это ещё мягко сказано, долго пялился и ничего не понял.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #4  
Старый 20.12.2012, 23:07
Taemin Taemin вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 45
Репутация: 10
По умолчанию

Объясните на другом примере как реализовать подобное. Это же раздел для новичков ) наверняка и страшнее код выдели )
Ответить с цитированием
  #5  
Старый 20.12.2012, 23:08
Taemin Taemin вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 45
Репутация: 10
По умолчанию

Мне главное понять сам механизм а не решить ту простенькую задачку в одну строку кода )
Ответить с цитированием
  #6  
Старый 20.12.2012, 23:10
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

1. Вообще не ясно зачем такой изврат. Нужно функцию объявить как экспортируемую, затем LoadLibraryEx (если из внешнего exe) или LoadLibrary если из самого себя. Потом получаешь адрес процедуры и вперед. Но все это изврат.
2. FindComponent.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #7  
Старый 20.12.2012, 23:31
Taemin Taemin вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 45
Репутация: 10
По умолчанию

Объясню. Есть процедура, которая по значению глобальной переменной A внутри высчитывает значения B,C,D и записывает их в соответствующие компоненты Edit1, Edit2, Edit3. Так вот если у меня пять значений переменной A, которые записаны скажем в разных Edit-ах как мне поочередно загнать их в одну и ту же процедуру и высчитать значения B,C,D для каждого из A + записать по разным Edit-ам, которых уже будет не 3 а 15.
Самое тупое решение – наплодить 5 одинаковых процедур. Но вот меня интересует как это сделать без лишней мороки? Именно поэтому такие вопросы в первом сообщении… ответы я планировал использовать для решения этой задачки.
Ответить с цитированием
  #8  
Старый 20.12.2012, 23:33
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Procedure proc1(a, b, c: integer; aeditL tedit);

Ну типа так.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #9  
Старый 20.12.2012, 23:55
Taemin Taemin вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 45
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Procedure proc1(a, b, c: integer; aeditL tedit);

Ну типа так.
а можно чу-чуть больше пояснить? Пока не очень понятно. Или кусох кода с похожей задачей. Заранее большое спасибо.
Ответить с цитированием
  #10  
Старый 21.12.2012, 00:07
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Называем компоненты откуда брать: EditIN1....EditINn
Компоненты куда положить:EditOUT1_1, EditOUT1_2,..., EditOUT1_N,.., EditOUTN_M

Тогда процедура обработчик всего этого будет выглядеть примерно так:
Код:
procedure TSomeForm.CalcValues(index,count:integer);
var
  edit:TEdit;
  in_value:integer;
  i:integer;
begin
  edit:=FindComponent(Format('EditIN%d',[index])) as TEdit;
  if edit=nil then
    Exit;  //not found
  in_value:=StrToIntDef(edit.Text,0);
  for i:=1 to count do
    begin
      edit:=FindComponent(Format('EditOUT%d_%d',[index,i])) as TEdit;
      if edit=nil then
        continue;  //not found
      edit.Text:=IntToStr(in_value+i);
    end;
end;
Значение берется из одного эдита и, после некоторой обработки, выкладывается в несколько других эдитов.
Код надуман, приведен здесь только с целью показать как обращаться к компонентам по имени.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Aristarh Dark за это полезное сообщение:
OTVET2 (18.01.2013), Taemin (21.12.2012)
  #11  
Старый 21.12.2012, 01:22
Taemin Taemin вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 45
Репутация: 10
По умолчанию

Спасибо большое, этого более чем достаточно.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:37.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025