Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.024 c
3-60043
sts
2003-05-27 15:12
2003.06.19
master-detail


1-60185
Maxim Pshevlotsky
2003-06-05 09:09
2003.06.19
Выгрузка ActiveX Library


1-60191
kalishenko
2003-06-04 20:15
2003.06.19
Выравнивание строк в Wordе


1-60199
OlegM
2003-06-05 12:13
2003.06.19
Как получить имена всех компонентов на форме опред. типа


6-60285
ZayaC
2003-04-10 21:27
2003.06.19
Теоретический вопрос по чату