-
Доброе время суток. Уважаемые форумчане вот несколько вопросов.
Чтобы не создавать несколько отдельных тем по графике ( рисованию и выводу изображении).
Delphi 7, Win XP.
1 Из ресурса проекта вывожу на PaintBox jpeg изображения.procedure clickbutton(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
var ResStream: pstream;
begin
if pb<>nil then pb.Free;
ResStream:= NewMemoryStream;
resource2stream(ResStream,Hinstance,'1F','RCD');
ResStream.Position := 0;
jpg:=NewJpeg;
jpg.Loadfromstream(ResStream);//загружаем if PB = nil then begin
PB := NewPaintBox(form);
PB.OnPaint := TOnPaint( MakeMethod( nil, @DrawPaint ) );
PB.Width := jpg.Width-2;
PB.Height:= jpg.Height-2;
PB.SetPosition(56,34);
PB.Show;//должен быть показан
ResStream.Free;
end;
Вопрос можно ли выводить изображение не уничтожая каждый раз Paintbox? просто перерисовывая область?
2 В проекте мне нужно рисовать платоново тело (тетраэдр,гексаэдр и тд до Додекаэдр)
рисую в Painbox'се мне надо подцепить события мыши чтобы делать вращение, но возникает ошибка 216 целый ворох.
Как правильно прикреплять события мыши к Painbox'су чтобы работало?
procedure FormMouseMove(Dummy: Pointer;Sender:pControl; var Mouse: TMouseEventData;X,Y: Integer);
var a, b: real;
begin
if drawing then begin
a:=x-form.Width div 2; b:=y-form.Height div 2;
//|---------------------------------------------------|
//|Здесь тоже пришлось сделать checked хотя это не |
//|правильно. Но другого варианта я пока не придумал |
//|Раньше в этом месте был Case **index of |
//|---------------------------------------------------|
if RadioBox8.Checked then begin
Alf:=ArcTan2(b,a);
Bet:=Sqrt(Sqr(a/10)+Sqr(b/10));
end;
if RadioBox9.Checked then begin
Alf1:=ArcTan2(b,a);
Bet1:=Sqrt(Sqr(a/10)+Sqr(b/10));
end;
end;
Draw(sender);
DrawPaint(nil, Sender, PB.Canvas.Handle);
end;
//|-----------------------------------------------------|
//|FormMouseDown - не работает. Пытаюсь прикрутить к |
//|PB'су тогда получаю E 216. |
//|-----------------------------------------------------|
procedure FormMouseDown(Dummy: Pointer;Sender:pControl;var Mouse: TMouseEventData);
begin
Drawing:=True;
end;
//|-----------------------------------------------------------|
//|FormMouseUp - не работает. Пытаюсь прикрутить к |
//|PaintBox'су тогда получаю E 216. |
//|-----------------------------------------------------------|
procedure FormMouseUp(Dummy: Pointer;Sender:pControl; var Mouse: TMouseEventData);
begin
Drawing:=false;
end;
Если нужно могу кинуть код целиком.
3 Надо было сделать RadioGroup посмотрел статьи и сделал так:
RgBody:=NewGroupBox(form2, 'Плат-овы тела' ).SetPosition(2,3).SetSize(105,124);
RadioBox1 := NewRadioBox( RgBody, 'Тетраэдр' ).SetPosition( 2, 16 ).SetSize( 85, 20 );
RadioBox1.Tag:=1;
RadioBox2 := NewRadioBox( RgBody, 'Гексаэдр' ).SetPosition( 2, 36 ).SetSize( 85, 20 );
RadioBox2.Tag:=2;
RadioBox3 := NewRadioBox( RgBody, 'Октаэдр' ).SetPosition( 2, 56 ).SetSize( 85, 20 );
RadioBox3.Tag:=3;
RadioBox4 := NewRadioBox( RgBody, 'Икосаэдр').SetPosition( 2, 76 ).SetSize( 85, 20 );
RadioBox4.Tag:=4;
RadioBox5 := NewRadioBox( RgBody, 'Додэкаэдр').SetPosition(2, 96 ).SetSize( 96, 20 );
RadioBox5.Tag:=5;//|----------------------------------------------------|
//|RadiogrClick это процедура прикручена к RadioBox'сам|
//|таким образом как это было в статье на форуме. |
//|Через свойство tag. Замечание: правда с другими |
//|двумя GroupBox'сами такой фокус не прошел:( |
//|----------------------------------------------------|
procedure RadiogrClick(Dummy: Pointer;Sender:pControl);
begin
case sender.Tag of
1: Body:=Tetraedr(SizeBody);
2: Body:=Hexaedr(SizeBody);
3: Body:=Octaedr(SizeBody);
4: Body:=Icosahedron(SizeBody);
5: Body:=Dodecahedron(SizeBody);
end;{case}
Draw(sender);
DrawPaint(nil, Sender, PB.Canvas.Handle);
end;
Вопрос: Каким образом вызвать RadiogrClick() из другой процедуры (может есть другой вариант обработки RadioBox'сов)? -
Jon © (04.05.11 23:54) [1]
> 1 Из ресурса проекта вывожу на PaintBox jpeg изображения.
program Test;
{$R *.res}
uses
Windows, Messages, KOL, JPegObj;
var
PB: PControl;
JPG: PJpeg;
procedure DoPaint(Dummy: Pointer; Sender: PControl; DC: HDC);
begin
JPG.StretchDraw(Sender.Canvas.Handle, Sender.ClientRect);
end;
procedure btn1Click(Dummy: Pointer; Sender: PObj);
var
ResStream: PStream;
begin
ResStream := NewMemoryStream;
Resource2Stream(ResStream, Hinstance, 'Z1', RT_RCDATA);
ResStream.Position := 0;
JPG.LoadFromStream(ResStream);
ResStream.Free;
PB.Invalidate;
end;
begin
Applet := NewForm(nil, '');
with NewButton(Applet, 'Load')^ do
OnClick := TOnEvent(MakeMethod(nil, @btn1Click));
JPG := NewJpeg;
JPG.Bitmap := NewBitmap(1, 1);
Applet.Add2AutoFree(JPG);
PB := NewPaintbox(Applet);
PB.BoundsRect := MakeRect(40, 40, 200, 200);
PB.OnPaint := TOnPaint(MakeMethod(nil, @DoPaint));
Run(Applet);
end. -
to Jon Thank you, again, help me!
насчет пункта 3 можно сделать так перебрать состояния NewRadioBox на Checked. И снять и поставить флажок. Тогда должно получится:) -
3 Точнееvar i:integer;
... for i:=0 to Pred(RgBody.childcount) do
if RgBody.Children[i].checked=true then RgBody.children[i].SetRadioChecked
И будет клик по RadioBox'су ;) -
Jon © (09.05.11 00:34) [4]Sorry, I do not understand. SetRadioChecked should work:
program Test;
uses KOL;
var rb1, rb2, rb3, rb4: PControl;
procedure RadioClick(Dummy: Pointer; Sender: PObj);
begin
Applet.Caption := PControl(Sender).Text;
end;
procedure ButtonClick(Dummy: Pointer; Sender: PObj);
begin
rb1.SetRadioChecked;
end;
begin
Applet := NewForm(nil, '');
rb1 := NewRadiobox(Applet, '111');
rb2 := NewRadiobox(Applet, '222').PlaceDown;
rb3 := NewRadiobox(Applet, '333').PlaceDown;
rb4 := NewRadiobox(Applet, '444').PlaceDown;
rb1.Tag := 1;
rb2.Tag := 2;
rb3.Tag := 3;
rb4.Tag := 4;
rb1.OnClick := TOnEvent(MakeMethod(nil, @RadioClick));
rb2.OnClick := TOnEvent(MakeMethod(nil, @RadioClick));
rb3.OnClick := TOnEvent(MakeMethod(nil, @RadioClick));
rb4.OnClick := TOnEvent(MakeMethod(nil, @RadioClick));
with NewButton(Applet, '111').PlaceDown^ do
OnClick := TOnEvent(MakeMethod(nil, @ButtonClick));
rb3.SetRadioChecked;
Run(Applet);
end. -
to Jon. Когда запускаешь твой пример то нет черных кружков :)
нужно добавить...
OnClick := TOnEvent(MakeMethod(nil, @ButtonClick));
rb3.GetWindowHandle;
rb3.SetRadioChecked;
...
И небольшой пример он все объясняет.program Project1;
uses
kol;
var
form,RgBody,
RadioBox1,RadioBox2,RadioBox3,
RadioBox4,RadioBox5,
Button:PControl;
//область для процедур
procedure RadiogrClick(Dummy: Pointer;Sender:pControl);
begin
case sender.Tag of
1: showmessage('Tetrahedron');
2: showmessage('Hexahedron');
3: showmessage('Octahedron');
4: showmessage('Icosahedron');
5: showmessage('Dodecahedron');
end;{case}
end;
procedure clickbutton(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
var i:integer;
begin
for i:=0 to Pred(RgBody.childcount) do
if RgBody.Children[i].checked=true then RgBody.children[i].SetRadioChecked
end;
Begin
form:=NewForm(Applet,'Radiogroup').SetSize(300,200).setposition(330,300);
RgBody:=NewGroupBox(form, 'Platonov tela' ).SetPosition(2,3).SetSize(105,124);
RadioBox1 := NewRadioBox( RgBody, 'Tetrahedron' ).SetPosition( 2, 16 ).SetSize( 90, 20 ); //.SetAlign(caTop)
RadioBox1.Tag:=1;
RadioBox2 := NewRadioBox( RgBody, 'Hexahedron' ).SetPosition( 2, 36 ).SetSize( 90, 20 );
RadioBox2.Tag:=2;
RadioBox3 := NewRadioBox( RgBody, 'Octahedron' ).SetPosition( 2, 56 ).SetSize( 90, 20 );
RadioBox3.Tag:=3;
RadioBox4 := NewRadioBox( RgBody, 'Icosahedron').SetPosition( 2, 76 ).SetSize( 90, 20 );
RadioBox4.Tag:=4;
RadioBox5 := NewRadioBox( RgBody, 'Dodecahedron').SetPosition( 2, 96 ).SetSize( 96, 20 );
RadioBox5.Tag:=5;
RadioBox3.GetWindowHandle;
RadioBox3.SetRadioChecked;
//область для работы
Button:=NewButton(form,'Click').SetPosition(158,143 ).SetSize(80,25);
(*RgBodyClick*)
RadioBox1.OnClick := TOnEvent(MakeMethod(nil, @RadiogrClick));
RadioBox2.OnClick := TOnEvent(MakeMethod(nil, @RadiogrClick));
RadioBox3.OnClick := TOnEvent(MakeMethod(nil, @RadiogrClick));
RadioBox4.OnClick := TOnEvent(MakeMethod(nil, @RadiogrClick));
RadioBox5.OnClick := TOnEvent(MakeMethod(nil, @RadiogrClick));
Button.OnClick:=TonEvent(MakeMethod(nil,@clickbutton));
Run(form);
end.
Если нужно могу послать на мыло. -
Jon © (11.05.11 02:52) [6]
> to Jon. Когда запускаешь твой пример то нет черных кружков
> :)
> нужно добавить
>
> ...
> OnClick := TOnEvent(MakeMethod(nil, @ButtonClick));
> rb3.GetWindowHandle;
> rb3.SetRadioChecked;
> ...
That is strange - it works correctly for me. Radio marks are shown.
I am using Delphi 7 with KOL v3.14159265358979 on Windows XP.
I still do not understand the problem. Maybe this is what you need:
program Test;
uses KOL;
var
Form, RgBody, RadioBox1, RadioBox2, RadioBox3, RadioBox4, RadioBox5, Button: PControl;
procedure RadioAction(Sender: PControl);
begin
case Sender.Tag of
1: ShowMessage('Tetrahedron');
2: ShowMessage('Hexahedron');
3: ShowMessage('Octahedron');
4: ShowMessage('Icosahedron');
5: ShowMessage('Dodecahedron');
end;
end;
procedure ClickButton(Dummy: Pointer; Sender: PControl; var Mouse: TMouseEventData);
var
i: Integer;
begin
for i := 0 to Pred(RgBody.ChildCount) do
if RgBody.Children[i].Checked = True then
RadioAction(RgBody.Children[i]);
end;
begin
Form := NewForm(Applet, 'Radiogroup').SetSize(300, 200).SetPosition(330, 300);
RgBody := NewGroupBox(Form, 'Platonov tela').SetPosition(2, 3).SetSize(105, 124);
RadioBox1 := NewRadioBox(RgBody, 'Tetrahedron').SetPosition(2, 16).SetSize(90, 20);
RadioBox1.Tag := 1;
RadioBox2 := NewRadioBox(RgBody, 'Hexahedron').SetPosition(2, 36).SetSize(90, 20);
RadioBox2.Tag := 2;
RadioBox3 := NewRadioBox(RgBody, 'Octahedron').SetPosition(2, 56).SetSize(90, 20);
RadioBox3.Tag := 3;
RadioBox4 := NewRadioBox(RgBody, 'Icosahedron').SetPosition(2, 76).SetSize(90, 20);
RadioBox4.Tag := 4;
RadioBox5 := NewRadioBox(RgBody, 'Dodecahedron').SetPosition(2, 96).SetSize(96, 20);
RadioBox5.Tag := 5;
// RadioBox3.GetWindowHandle;
RadioBox3.SetRadioChecked;
Button := NewButton(Form, 'Click').SetPosition(158, 143).SetSize(80, 25);
Button.OnClick := TOnEvent(MakeMethod(nil, @ClickButton));
Run(Form);
end.
Now just the button performs the event when clicked.
We can discuss this further on email - then post results here. -
All true in version 3.5 was 3.14RadioBox3.GetWindowHandle;
not necessary. -
Пункт 2 Проблема подключения событий. Решение показал Jon.procedure FormMouseMove(Dummy: Pointer;Sender:pControl; var Mouse: TMouseEventData);
var a, b: real;
begin
if drawing then begin
a:=Mouse.X-Sender.Width div 2; b:=Mouse.y-Sender.Height div 2;
case RgRIndex of
1:begin
Alf:=ArcTan2(b,a);
Bet:=Sqrt(Sqr(a/10)+Sqr(b/10));
end;
0:begin
Alf1:=ArcTan2(b,a);
Bet1:=Sqrt(Sqr(a/10)+Sqr(b/10));
end;
end;
end;//Case
PB.Invalidate;
end; -
Целиком здесь
http://zalil.ru/31135068