![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() 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
|
||||
|
||||
![]() Что это за изврат под первым пунктом?
Тем более, что тип myproc у тебя stdcall, а proc1 - fastcall, ошибка же будет, если параметризуешь. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
![]() Это ещё мягко сказано, долго пялился и ничего не понял.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#4
|
|||
|
|||
![]() Объясните на другом примере как реализовать подобное. Это же раздел для новичков ) наверняка и страшнее код выдели )
|
#5
|
|||
|
|||
![]() Мне главное понять сам механизм а не решить ту простенькую задачку в одну строку кода )
|
#6
|
||||
|
||||
![]() 1. Вообще не ясно зачем такой изврат. Нужно функцию объявить как экспортируемую, затем LoadLibraryEx (если из внешнего exe) или LoadLibrary если из самого себя. Потом получаешь адрес процедуры и вперед. Но все это изврат.
2. FindComponent. Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#7
|
|||
|
|||
![]() Объясню. Есть процедура, которая по значению глобальной переменной A внутри высчитывает значения B,C,D и записывает их в соответствующие компоненты Edit1, Edit2, Edit3. Так вот если у меня пять значений переменной A, которые записаны скажем в разных Edit-ах как мне поочередно загнать их в одну и ту же процедуру и высчитать значения B,C,D для каждого из A + записать по разным Edit-ам, которых уже будет не 3 а 15.
Самое тупое решение – наплодить 5 одинаковых процедур. Но вот меня интересует как это сделать без лишней мороки? Именно поэтому такие вопросы в первом сообщении… ответы я планировал использовать для решения этой задачки. |
#8
|
||||
|
||||
![]() Procedure proc1(a, b, c: integer; aeditL tedit);
Ну типа так. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#9
|
|||
|
|||
![]() Цитата:
|
#10
|
||||
|
||||
![]() Называем компоненты откуда брать: 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; Код надуман, приведен здесь только с целью показать как обращаться к компонентам по имени. Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#11
|
|||
|
|||
![]() Спасибо большое, этого более чем достаточно.
|