Текущий архив: 2003.06.19;
Скачать: CL | DM;
Вниз
Как передать параметр в LineDDA функцию? Найти похожие ветки
← →
Тфьу (2003-06-05 11:37) [0]Почему cl не передается в CMyDraw? Причем когда рботает, когда не работает... Судя по всему с ссылочной процедурой надо по особому работать? Как?
Procedure Draw;
Var
cl: TColor;
procedure CMyDraw(X,Y: integer; Canvas: TCanvas);stdcall;
begin
If Canvas.Pixels[X,Y]=cl then
Canvas.Pixels[X,Y]:=Canvas.Pen.Color;
end;
begin
cl:=clRed;
LineDDA(X,Y,X1,Y1,@CMyDraw,Integer(Canvas));
end;
← →
Song (2003-06-05 11:53) [1]А как ты понял что она не передаётся?
Она у тебя в CMyDraw даже не используеся.
← →
reonid (2003-06-05 12:00) [2]Так cl - локальная переменная. Она адресуется относительно
вершины стека.
А внутри LineDDA стек уже не тот.
← →
Тфьу (2003-06-05 12:59) [3]reonid ©: А как можно ее адресовать? Когда я объявлял ее в private области объекта - вообще ошибку выдает при выполнении.
Song ©: Используеся, если повнимательнее посмотреть. Я ее выводил, и она отличалась от переданной.
← →
Anatoly Podgoretsky (2003-06-05 13:03) [4]А передавать не TCanvas а свою структуру, где есть оба этих элемента
← →
reonid (2003-06-05 13:09) [5]сделай её глобальной, например.
← →
SVM (Perm) (2003-06-05 13:29) [6]А почему CMyDraw - локальная процедура???
← →
reonid (2003-06-05 13:35) [7]SVM (Perm) (05.06.03 13:29)
Очевидно, потому что автор надеялся обратиться
в ней к локальным переменным процедуры Draw.
← →
Anatoly Podgoretsky (2003-06-05 13:40) [8]Тажа ошибка при работе с ассемблерными локальными процедурами и переменными.
← →
icWasya (2003-06-06 11:10) [9]в приведённом куске кода процедуры CMyDraw1и CMyDraw2 хоть и выглядят одинаково, но на самом деле вызываются(на уровне ASM) по разному.
При вызове процедуры CMyDraw2 ей неявно передаётся указатель на область локальных переменных процедуры MyDraw.
А когда она вызывается из LineDDA, то этого конечно не делается.
procedure CMyDraw1(X,Y: integer; Canvas: TCanvas);stdcall;
begin
//.......
end;
Procedure MyDraw;
Var C:TColor;
procedure CMyDraw2(X,Y: integer; Canvas: TCanvas);stdcall;
begin
//.......
end;
begin
//............
LineDDA(X,Y,X1,Y1,@CMyDraw1,Integer(Canvas));
LineDDA(X,Y,X1,Y1,@CMyDraw2,Integer(Canvas));
//............
end;
← →
Kudatsky (2003-06-06 11:47) [10]Формат CMyDraw такой:
procedure CMyDraw(X,Y:Integer;Canvas:TCanvas);stdcall;
Всё остальное должно передаваться как глобальные переменные.
Страницы: 1 вся ветка
Текущий архив: 2003.06.19;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.007 c