Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];

Вниз

Не рисует на канве   Найти похожие ветки 

 
Чертежник   (2006-02-27 05:50) [0]

Есть такой код

type

 TSupportPoint = class(TObject)
   ID          :     TColor;
   CoordOnEarth:     TCoordsOnEarth;
 end;
 
 TBranchPoint = class(TSupportPoint)
   Depth       :     extended;
   TypeWell    :     TTypeWell;
   function  NewBranchPoint(X,Y:integer):TBranchPoint;
   procedure MoveBranchPoint(x,y:integer);
   procedure DrawBranchPoint;
 end;

 TSegmentCommunicate = class(TObject)
   ID          :     TColor;
   DateCreate  :     TDate;
   TimeUse     :     word;
   BranchsSet  :     TList;
   procedure MoveSegCom(x,y:integer);
 end;

 TSegmentCommunicateRL = class(TSegmentCommunicate)
   Type_RL     :     TType_RL;
   Width       :     word;
   function  NewSegCom(X,Y,Width:integer):TSegmentCommunicateRL;
   procedure DrawSegRL(SegID:TColor);
 end;

...

var
 MapReal:TBitmap;
 MapMirror:TBitmap;

...

procedure TSegmentCommunicateRL.DrawSegRL(SegID:Tcolor);
var
 i:integer;
 BrnPnt:TBranchPoint;

begin
 BrnPnt:=self.BranchsSet.Items[0];

 MapReal.Canvas.Pen.Color:=clBlack;
 MapReal.Canvas.Brush.Color:=clBlack;
 MapReal.Canvas.MoveTo(round(BrnPnt.CoordOnEarth.x),round(BrnPnt.CoordOnEarth.y)) ;

 MapMirror.Canvas.Pen.Color:=SegID;
 MapMirror.Canvas.Brush.Color:=SegID;
 MapMirror.Canvas.MoveTo(round(BrnPnt.CoordOnEarth.x),round(BrnPnt.CoordOnEarth.y ));
 for i:=1 to self.BranchsSet.Count-1 do
 begin
   BrnPnt:=self.BranchsSet.Items[i];

   MapReal.Canvas.Pen.Color:=clBlack;
   MapReal.Canvas.Brush.Color:=clBlack;
   MapReal.Canvas.LineTo(round(BrnPnt.CoordOnEarth.x),round(BrnPnt.CoordOnEarth.y)) ;

   MapMirror.Canvas.Pen.Color:=SegID;
   MapMirror.Canvas.Brush.Color:=SegID;
   MapMirror.Canvas.MoveTo(round(BrnPnt.CoordOnEarth.x),round(BrnPnt.CoordOnEarth.y ));
 end;
end;
...

Далее по коду идет вызов метода DrawSegRL  и после вызова этого метода делаю следующее
 form2.Image1.Canvas.Draw(0,0,MapReal);
Вместо ожидаемого чертежа получаю белый холст.
Я попытался заменить в методе DrawSegRL все строки MapReal на form2.Image1 т.е. рисовать не через промежуточный Bitmap, а напрямую, и все заработало.
Но ведь, я уверен, через промежуточный Bitmap тоже должно работать и причем быстрее.
Что я делаю не так?


 
Джо ©   (2006-02-27 06:00) [1]

Навскидку (глаза слипаются) — какой режим пера установлен в MapReal.Canvas на момент вызова метода DrawSegRL? Может, psClear?
--
П.С. Код ужасный :)


 
Чертежник   (2006-02-27 06:14) [2]

Спасибо за преодоление сна!
Сейчас попробовал явно установить в psSolid - не помогло.

ЗЫ Чем же он ужасен. (конструктивно смотрю на критику).


 
Defunct ©   (2006-02-27 06:52) [3]

> var
> MapReal:TBitmap;
> MapMirror:TBitmap;

Размеры-то Bitmap"ам заданы? Если не задать размеры, то ниче рисоваться как раз и не будет.


 
Defunct ©   (2006-02-27 06:56) [4]

> П.С. Код ужасный :)

Ой ли так уж сильно ужастный ;>
надо полагать аффтар специально урезал часть описания классов, дабы нам было труднее ему помочь ;)


 
Джо ©   (2006-02-27 15:57) [5]

Помимо размеров битмапов, может, PenMode где-то меняется?

---
В мелочах ужасен, в мелочах :) А из-за мелочей выходит, зачастую, глюкодром:

1. Поля в классах лучше сделать свойствами с соответствующими методами доступа.
2. self.BranchsSet.Items[0];
 а) Self убрать
 б) Items следовало бы сделать default свойством и обращаться просто BranchsSet[0]
3. for i:=1 to self.BranchsSet.Count-1 do — нумерацию элементов с 0.
4. Дублирующийся код в DrawSegRL, лучше продумать логику и вынести повторяющиеся части в отдельные private-методы.
5. Оператор with не зря придумали :)
6. Зачем постоянно присвивается clBlack pen"у?
7. Зачем вообще устанавливаетсяBrush.Color?

и т.д и т.п... :)


 
Чертежник   (2006-02-27 15:59) [6]


> Defunct ©   (27.02.06 06:52) [3]

О, спасибо! Все заработало! А в каком то примере делфовском было без явного указания размеров Bitmap, вот я и по аналогии, видимо там я что-то недосмотрел.


> Джо ©   (27.02.06 06:00) [1]   П.С. Код ужасный :)

> Defunct ©   (27.02.06 06:56) [4]


Да, действительно большинство классов здесь вы не увидите, но они никак не касаются прорисовки.
И хватит меня уже расстравать пожалуйста. Если вы действительно считаете мой код ужасным, то укажите на явные ошибки, а там я сам соображу.
И спасибо за помощь.


 
Джо ©   (2006-02-27 16:03) [7]

> то укажите на явные ошибки, а там я сам соображу.

Свои замечания по коду я привел, см. [5]


 
Чертежник   (2006-02-27 16:07) [8]


> Джо ©   (27.02.06 15:57) [5]

Если не затруднит ответьте на вопросы.

1. А в чем разница?
2б. А как это сделать?
3. 0-вой элемент я вытягиваю из списка до цикла и делаю moveto, а затем делаю lineto до i-го в цикле. Здесь не должно быть ошибки. я сделал это сознательно.
4. 5. 6. 7. Спасибо, это от того что долго ковырял почему код не работал, вот и осталось


 
Джо ©   (2006-02-27 16:14) [9]

> [8] Чертежник   (27.02.06 16:07)

1. Нарушение инкапсуляции. И вообще, как правило, вместо классов, имеющих ТОЛЬКО данные (без методов) желательнее использовать записи (records). Или же включить данные этого класса в другой, "рабочий" класс с методами.

2б. См. реализацию любого контейнера, например TList (индексное свойство Items).

3. Да, я ошибся.


 
Чертежник   (2006-02-27 16:20) [10]


> Джо ©   (27.02.06 16:14) [9]

Спасибо огромное


 
Defunct ©   (2006-03-01 00:37) [11]

Джо ©   (27.02.06 16:14) [9]

по поводу 1.. Согласен, но я бы не был так категоричен, т.к. у него класс с одними только даннымим используется, как я понял, только для наследования. Вероятно он видоизменится позже.

PS: правильные имена классов и полей говорят о том, что автор кода "в танке" что к чему.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.034 c
2-1142935290
tort
2006-03-21 13:01
2006.04.02
Что такое Tag и как им пользоваться?


15-1142228476
Ega23
2006-03-13 08:41
2006.04.02
С Днём рождения! 13 марта


15-1142149750
Ega23
2006-03-12 10:49
2006.04.02
С Днём рождения! 11 марта


2-1142685685
Fenix
2006-03-18 15:41
2006.04.02
Добавление иконки на SpeedButton


15-1141722985
superoberon
2006-03-07 12:16
2006.04.02
Shelltreeview





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский