![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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, ошибка же будет, если параметризуешь. |
|
#3
|
||||
|
||||
|
Это ещё мягко сказано, долго пялился и ничего не понял.
|
|
#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);
Ну типа так. |
|
#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
|
|||
|
|||
|
Спасибо большое, этого более чем достаточно.
|