Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwicklung (https://www.delphipraxis.net/11917-canvas-rahmen-aufziehen-laufzeit-%3D-wie-aufziehen-entwicklung.html)

cyberfreak 16. Nov 2003 21:20


canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwicklung
 
Hi!

Also ich möchte mit Canvas oder sonstwie, einen Rahmen (zur Laufzeit) auf das Formular ziehen können, und dann auf genau dieser Stelle eine Komponente erstellen. Das erstellen der Komponente wäre ja nicht dsa Problem, sondern Canvas! Wie bekomme ich am Besten die Koordinaten, und in welche Formular-Methoden soll ich das schreiben? Bitte hilfe!

mfg
cyberfreak

Stanlay Hanks 16. Nov 2003 21:34

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Hallo und herzlich willkommen in der DP! :hello:
Ich verstehe leider nicht ganz, was du genau meinst.
Möchtest du nur einen Rahmen um dein Formular zeichnen? Dann schreib einfach ins OnPaint deines Forms

Delphi-Quellcode:
Canvas.Brush.Style := bsClear; //Macht das Recheck durchsichtig
Canvas.Rectangle(0,0,Width,Height) //Zeichnet ein Rechteck mit den Maßen des Forms.
Falls du was anderes gemeint hast, dann korrigier mich bitte.

Man liest sich, Stanlay :hi:

HAF4ever 16. Nov 2003 21:35

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
:gruebel:
sorry, aber ich hab nicht verstanden was du eigentlich machen möchtest.
versuch doch einfach einmal dich klarer auszudrücken und zu schreiben was du schon versucht hast

cyberfreak 16. Nov 2003 21:42

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Ja, das sieht so aus, dass man den Rahmen zur Laufzeit "aufziehen" können soll, um dann da eine Komponente zur Laufzeit zu erstellen. das soll man mit der Maus machen, so als wenn man in der Delphi-Entwicklungsumgebung eine Komponente erstellt, aber eben zur Laufzeit.

flomei 16. Nov 2003 21:46

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
:wiejetzt: Du willst Delphi-Komponenten zur Laufzeit auf die Form ziehen und "mitarbeiten" lassen?
Das geht so nicht. Du kannst aber Komponenten zur Laufzeit erstellen. Danach musst du mal suchen

MfG Florian :hi:

cyberfreak 16. Nov 2003 21:51

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Nein, das ist wieder nicht was ich meinte!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!
Also, nochmal:

Das "aufziehen" geht ja! Vergesst mal das mit der Komponente! Ich will einfach nur einen Rahmen mit der Maus aufziehen, den Rest kann ich ja!

Stanlay Hanks 16. Nov 2003 21:54

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Achso! Dann war ich ja vollkommen falsch...
Dann probier mal folgendes:

Delphi-Quellcode:
var IsMouseDown : Boolean;
    PanelNr : Integer = 0;
    xk,yk : Integer;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
xk := x;
yk := y;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
IF IsMouseDown = true THEN
begin

Inc(PanelNr);
  With TPanel.Create(Form1) do
    begin
      Parent := Form1;
      Name := 'Panel' + IntToSTr(PanelNr);
      Left := xk;
      Top := yk;
      Width := x-xk;
      Height := y-yk;
    end;

IsMouseDown := False;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
IsMouseDown := true;
end;
Wenn du auf Button1 klickst, wird eine Variable auf True gesetzt, die dem programm sagt, dass es beim nächsten aufziehen (Rahmenziehen) der Maus ein Panel zeichnen soll. Bei einem MouseDown werden die aktuellen Koordinaten gemerkt und bei MouseUp wird mit den gemerkten und den aktuellen Koordinaten ein Panel gezeichnet. (dynamisch erstellt)

Hattest du das so gemeint?

[EDIT] Das macht natürlich noch keinen visuellen Rahmen [/EDIT]

cyberfreak 16. Nov 2003 22:04

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Ja, perfekt! So hab ich das gemeint, und das mit dem Button stimmt auch so, denn ich will das ja genau so machen (per Toolbar)!
Danke, aber etwas wäre, da noch: Und zwar sollte man vielleicht noch beim aufziehen einen Rahmen sehen, so wie in Delphi (in der IDE). Und ausserdem müsste ich irgendwiedie Komponenten ausseinanderhalten, da ich mehrere Komponenten habe(ToolbarButton1 = Button, ToolbarButton2 = Panel, ToolbarButton3 = Label, usw.)

himitsu 16. Nov 2003 22:04

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Auch ein Hallo von mir. :hello:

Ich glaub, das dir die folgenden Artikel etwas weiter helfen.

Wie bastelt man einen einfachen Formular-Editor?
Komponenten verschiebbar / Größe veränderbar

cyberfreak 16. Nov 2003 22:10

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Genau, so wie bei dem Beitrag von Himitsu(der Formular-Editor) das Beispiel, so ein Rahmen vielleicht, und auch hat sich jetzt das Verschiebe-Problem gelöst!
Danke Himitsu

Stanlay Hanks 16. Nov 2003 22:12

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Hi. Hab meinen Ursprüunglichen Source mit dem OnMouseMove noch etwas erweitert. Du müsstest ihn halt für dich anpassen. (unter Anderem können die Panels nicht gezeichnet werden, wenn der ausgangspunkt größer ist als der Endpunkt) Aber du sagtest ja, dass ist nicht das Problem.

Ich hätte das folgendermaßen gelöst:

Delphi-Quellcode:
var xm,ym : Integer;
begin
  IF IsMouseDown = true THEN
   begin
    With Form1.Canvas do
    begin
    Pen.Color := clbtnface;
    Pen.Style := pssolid;
    Rectangle(xk,yk,xm,ym);
    Brush.Color := clbtnface;
    Rectangle(0,0,Width,Height);
    Pen.Color := clblack;
    Pen.Style := psDot;
    Rectangle(xk,yk,x,y);
    end;
   end;
 xm := x;
 ym := y;
end;
Im Endeffekt mach ich nix anderes, als jedes mal einen gestrichelten Rahmen (psdot) gezeichnet und das Canvas wieder neu zu übermalen, so dass die alten Rahmen nicht mehr da sind. Funzt natürlich nur mit einfarbigem Hintergrund :wink:

Man liest sich, Stanlay :hi:

cyberfreak 16. Nov 2003 22:20

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Wie meinst du das mit Endpunkt größer als Ausgangspunkt? Bei was Rahmen? Oder Komponente?

Stanlay Hanks 16. Nov 2003 22:23

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Delphi-Quellcode:
Width := x-xk;
Height := y-yk;
Damit mein ich diese Zeilen. Is ja auch logisch. Wenn der Punkt, an dem du die Maus runtergrdrückt hast (xk,yk) kleiner is, als der Punkt an dem die Maus in dem Moment ist, wo du sie loslässt, dann würde das panel ja eine Minus Größe haben...Aber das könnte man ja noch anpassen (Wenn x kleiner als xs, dann mach es umgekehrt als vorher usw...)

Man liest sich, Stanlay :hi:

scp 16. Nov 2003 22:46

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Wenn man über das gesamte Form ein leeres Image legt und auf dessen Canvas den Rahmen zeichnet, dann bleiben auch evtl. nicht einfarbige Hintergründe und Bilder erhalten.

himitsu 16. Nov 2003 23:28

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Noch eine kleine Anmerkung zu Stanlay's Post.
Zitat:

Zitat von Stanlay
Funzt natürlich nur mit einfarbigem Hintergrund

Hast du schon ein mal ein bissel mit PenMode rumgespielt?
OH > TPenMode

Einfach mal in das OnPaint-Ereignis eine leeren Formulars setzen. :mrgreen:
Delphi-Quellcode:
Procedure TForm1.FormPaint(Sender: TObject);
  Procedure Z(P: Integer; PM: TPenMode);
    Begin
      Canvas.Pen.Mode := PM;
      Canvas.Rectangle(20, P, 100, P + 7);
      Canvas.Rectangle(120, P, 200, P + 7);
      Canvas.Rectangle(120, P, 200, P + 7);
    End;

  Var X: Integer;

  Begin
    Canvas.Pen.Mode := pmCopy;
    Canvas.Brush.Color := clBtnFace;
    Canvas.FillRect(Rect(0, 0, 220, 202));

    Canvas.Brush.Color := clGreen;
    For X := 1 to 13 do
      Canvas.FillRect(Rect(X * 15, 25, X * 15 + 8, 192));

    Canvas.Brush.Color := clBlue;
    Canvas.Pen.Color := clRed;
    Canvas.Rectangle(10, 10, 210, 17);
    Z(30, pmBlack);
    Z(40, pmWhite);
    Z(50, pmNop);
    Z(60, pmNot);         {x}
    Z(70, pmCopy);        {Standard}
    Z(80, pmNotCopy);
    Z(90, pmMergePenNot);
    Z(100, pmMaskPenNot);
    Z(110, pmMergeNotPen);
    Z(120, pmMaskNotPen);
    Z(130, pmMerge);
    Z(140, pmNotMerge);
    Z(150, pmMask);
    Z(160, pmNotMask);
    Z(170, pmXor);        {x}
    Z(180, pmNotXor);     {x}
  End;

iamjoosy 17. Nov 2003 15:12

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Hi, schau doch bitte mal bei Torry.net unter "TrectBox", ich denke das ist genau das was Du brauchst !
Fertige Komponente, die man verscheiben ziehen etc. kann.

HTH

cyberfreak 17. Nov 2003 21:23

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Danke für eure vielen Tips! Und die TRectBox kann ich nicht downloaden, da ich die Seite nicht aufrufen kann. Vielleicht könnte sie mir ja jemand schicken? Mail und alles steht ja unten! Bitte!
Und außerdem wäre mein Problem jetzt fast perfekt gelöst wenn ich noch wüsste, wie man den Rahmen schon beim erzeugen anzeigen kann. So z.B.: Bei onMouseMove soll sich der Rahmen jenachdem vergrößern, oder verkleinern. Wie man die Maus eben bewegt!

mfg
cyberfreak

Stanlay Hanks 17. Nov 2003 21:28

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Aber genau das macht der Rahmen doch, wenn du die Prozedur von mir und die dementsprechenden Ergänzungen von himitsu z.B. nimmst.

Man liest sich, Stanlay :hi:

cyberfreak 17. Nov 2003 21:34

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Ok, werde ich machen. Gibts eigentlich auch irgendwo eine Dokumentation, Auflistung, oder ähnliches mit sämtlichen Funktionen und Möglichkeiten von Delphi? So wie zum Beispiel in Java (programmiere ich nämlich auch ein bisschen) die Java Docs (Java Dokumentaion) falls das jemand kennt.

Stanlay Hanks 17. Nov 2003 21:39

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Ich weiß nicht, ob du sowas meinst, aber das Entwicklerhandbuch vom Handbuchsatz von Borland ist recht ausführlich und detailliert geschrieben...kommt ja auch direkt von der Quelle :wink:

Man liest sich, Stanlay :hi:

cyberfreak 17. Nov 2003 21:46

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Ja, es ist nur so, dass ich kein Handbuch habe. Ich hab nur ne Demo von Delphi 7 Enterprise Edition, von ner Buch-CD runter ("Jetzt lerne ich Delphi" vom Markt+Technik-Verlag) Ich dachte, da vielleicht eher an etwas zum downloaden, oder etwas das Online ist.

Basic-Master 17. Nov 2003 22:09

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
er will die gleiche bzw. ne ähnliche funktion wie das mit dem designen von kompos in delphi der fall ist, hier die procedure um die punkte da zu zeichnen:
Delphi-Quellcode:
procedure zeichnen(obj:twincontrol);
var h:hwnd;
    canvas:tcanvas;
begin
h := getdc(obj.Handle);
if h = 0 then exit;
canvas := tcanvas.Create;
canvas.Handle := h;
canvas.Pen.Color := clblack;
canvas.Brush.Color := clblack;
canvas.Rectangle(0,0, 6, 6);
canvas.Rectangle(obj.Width div 2, 0, obj.Width div 2 + 6, 6);
canvas.Rectangle(obj.Width - 6, 0, obj.Width, 6);
canvas.Rectangle(0, obj.Height - 6, 6, obj.Height);
canvas.Rectangle(obj.Width div 2, obj.Height - 6, obj.Width div 2 + 6, obj.Height);
canvas.Rectangle(obj.Width - 6, obj.Height - 6, obj.Width, obj.Height);
end;

iamjoosy 17. Nov 2003 23:05

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Ok, hier nochmal das mit TRectBox:

www.torry.nettorry.net

Da bei QuickSearch (Rechts oben) TrectBox eingeben und schon ist man da !

cyberfreak 18. Nov 2003 09:32

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
ja, Torry's Seite geht schon, nur die Diprode.irgendwas geht nicht, aber mir ist ja jetzt aufgefallen, dass man das ja direkt auf Torry.net downloaden kann

cyberfreak 18. Nov 2003 20:10

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Ähm, BasicMaster war dsa jetzt alles an Quellcode?

Basic-Master 18. Nov 2003 20:12

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
nee, da fehlen natürlich noch das entsprechende event in mousemove.. hatte bis jetzt nur noch keine gelegenheit damit anzufangen :roll:

cyberfreak 18. Nov 2003 20:17

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Aha! Könntest du (BasicMaster) mich vielleicht in deiner ICQ-Liste zulassen, dann würde ich nicht immer Rätselraten brauchen ob du online bist oder nicht!

Keldorn 19. Nov 2003 11:10

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo

ich habe vor einem ähnlichen Problem gestanden. Ich wollte in einer Scrollbox einen Rahmen zeichnen. Mein Problem war nicht der Rahmen, sondern daß der Rahmen über den Komponenten der Scrollbox liegt.

Ich habs dann so gelöst (siehe Test-projekt im Anhang). Der Code ist etwas umfangreicher, da ich die Scrollbox auch noch beim Rahmenziehen scrollen will.

Mfg Frank

cyberfreak 19. Nov 2003 11:37

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Hi Keldorn, danke für das Zeug. Aber ich hab grad kein Delphi hier. Könntest du mir vielleicht ne EXE kompilieren und anhängen?

Keldorn 19. Nov 2003 11:53

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Liste der Anhänge anzeigen (Anzahl: 1)
klar, der Rahmen ist aber nur in der Scrollbox aktiv.

cyberfreak 19. Nov 2003 12:48

Re: canvas.rahmen.aufziehen.laufzeit = wie.aufziehen.entwick
 
Danke Keldorn, das ist wahnsinn! Genau das habe ich gesucht, nur, dass eben nicht beim Loslassen eine MessageBox kommt sondern eine Komponente erstellt wird, und ich denke wohl, dass ich mir das jetzt genau so umschreiben kann.

Vielen Danke an alle. Aber das Problem ist jetzt gelöst!

mfg
cyberfreak


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz