Главная страница
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.021 c
4-60459
DVM
2003-04-19 23:55
2003.06.19
Помогите с ListView и LVN_ENDLABELEDIT - нет моих больше сил!


6-60290
temp
2003-04-14 16:25
2003.06.19
Почему ошибка 500 в CGI?


14-60391
Мазут Береговой
2003-06-02 20:52
2003.06.19
Хотите узнать о мед.обслуживании в США? Читайте здесь:


1-60267
Analaiser
2003-06-06 08:33
2003.06.19
Помогите сделать контрольные по Дельфям!!!


1-60217
VikOss
2003-06-05 13:46
2003.06.19
Вызов из DLL