Текущий архив: 2006.04.02;
Скачать: CL | DM;
ВнизНе рисует на канве Найти похожие ветки
← →
Чертежник (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;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.042 c