![]() |
Selektionsrahmen um Komponente zeichnen?
Hallo?
Gibt es eine einfache Möglichkeit, den Selektionsrahmen, der zur Entwurfszeit um die ausgewählte Komponente gezeichnet wird, zur Laufzeit als Rahmen zu verwenden? Das hier:
Delphi-Quellcode:
führt nicht zum Ziel, da ComponentState einen Nur lesen Eigenschaft ist.
Label1.ComponentState := csDesigning;
Einer meiner Computerfreunde will das mit der LCL nutzen, sich aber nicht erst hier registrieren. Da ich davon ausgehe, das die LCL Interface-Kompatibel zur VCL ist, stelle ich diese Frage hier. Mein PC Freund Axel will einen Designer für das Gute Alte Turbo Vision bauen, hierzu aber mit Lazarus und der LCL den Designer bauen. Um das Ergebnis mit dem Guten Alten Turbo Vision verwenden zu können, erzeugt der Designer am Ende passenden Quelltext. Eine Formulardatei .lfm wird nicht erzeugt. Er lässt fragen, wieviele alte Turbo Vision Programme noch verwendet werden und eine "Frischzellenkur" gebrauchen könnten. Dann würde er nicht nur Ouelltext für das alte Turbo Vision im Designer erzeugen lassen, sondern zusätzlich einen Wrapper bauen, der das Turbo Vision Interface nachbildet, die Implementation jedoch mit der LCL realisiert. Dann könnten diese alten Programme auf Windoes portiert werden. Wie viele Interessenten gibt es da schätzungsweise? Bitte entschuldigt die exotische Frage, aber für Axel hat der Designer nur Sinn, wenn dieser Wrapper am Ende für die Allgemeinheit von Nutzen ist. Das dabei eine Designer für die alte DOS Version als Nebeneffekt entstehen würde, ist eher zweitrangig. So viele nutzen auch im FreeDOS-Bereich diese Objekte nicht mehr. |
Re: Selektionsrahmen um Komponente zeichnen?
Zitat:
Ist am einfachsten denke ich. Gruß Matthias |
Re: Selektionsrahmen um Komponente zeichnen?
Zitat:
|
Re: Selektionsrahmen um Komponente zeichnen?
du kannst dir ja mal die Komponenten TStretchhandle und TSizeCtrl anschauen, sind zwar beide VCL-Controls, aber evtl. kannst du diese in die LCL portieren.
Bei TsizeCtrl wär ich auch interessiert, da diese Komponente mächtiger ist und ich sie in meinem DFM-Editor verwende. leider verwendet diese aber auch ein paar WinApi-Tricks, welche das portieren nach linux schwieriger machen würden. HTH Frank |
Re: Selektionsrahmen um Komponente zeichnen?
Hallo,
Ich hab das jetzt so hier gelöst:
Delphi-Quellcode:
Die letzte Version, die mit TShape verdeckt mir leider meine Labelbeschriftung, womit ja die Komponente verdeckt wäre. Die Prozedut Decotate funktioniert gut.
procedure Decorate(hdc: HDC; r: TRect; penColor: TColor);
const PENWIDTH = 2; begin with TCanvas.Create do try Handle := hdc; Pen.Width := PENWIDTH; Pen.Color := penColor; InflateRect(r, PENWIDTH, PENWIDTH); Brush.Style := bsClear; Rectangle(r); finally Free; end; end; procedure TForm1.Label1MouseEnter(Sender: TObject); begin //Selektionsrahmen zeichnen with Sender as TLabel do Decorate(GetDC(Handle), BoundsRect, clHighlight); end; procedure TForm1.Label1MouseLeave(Sender: TObject); begin //Selektionsrahmen löschen { with Sender as TLabel do Decorate(GetDC(Handle), BoundsRect, self.Color);} end; procedure TForm1.Label1Click(Sender: TObject); begin { FShape := TShape.Create(self); FShape.Left := Label1.Left - 2; FShape.Top := Label1.Top - 2; FShape.Width := Label1.Width + 2; FShape.Height := Label1.Height + 2; FShape.Parent := self; } end; @Hansa: Schade, ich musste Axel die unschöne Kunde überbringen. Damit hat sich aber auch der Designer erledigt, für den er, nicht ich, den Selektionsrahmen gebraucht hätte. In die Lazarusquellen einzusteigen, das dauert einfach zu lange, um daraus eine Lösung zu extrahieren. Axel wir sich ein neues Projekt überlegen. Habe mir die Jedis mal angesehen. Da sind auch Formdesigner, Objektinspektor u.a. dabei. Aber wozu braucht man das noch. CodeGear und das Lazarusteam können doch Anwendungsdesigner echt besser programieren, als unsereiner, der sich jetzt in die Jedis erst mal einarbeiten muss. @_frank_: Ich habe trotzdem mal per GExperts Grep Suche nach TSizeCtrls und TStretchHandle gesucht, aber leider ohne Erfolg. Dann gegoogelt und TStretchHandle gefunden und runtergeladen. Werde mir den Quelletext trotz allem mal ansehen. TSizeCtrls hab ich gar nicht gefunden, da gibt mir auch Google keine Auskunft. Egal, jetzt guck ich mir mal den Quelltext von TStretchHandle an. Irgenwie hat mich der Ehrgeiz gepackt, obwohl wohl andere so einen Anwendungsdesigner besser hinkriegen werden, als ich. |
Re: Selektionsrahmen um Komponente zeichnen?
Zitat:
![]() btw. warum der Umweg über getdc? TLabel hat doch schon ein canvas-property... Gruß Frank |
Re: Selektionsrahmen um Komponente zeichnen?
Zitat:
|
Re: Selektionsrahmen um Komponente zeichnen?
Ich habe die Lösung da oben mal etwas umgeschrieben, ob es für jeden sinnvoll ist weis ich nicht:
Delphi-Quellcode:
{
iPw: PenWidth kann nun bei jedem Control selbst mitgegeben werden. iSp: Spacing, Abstand vom Control nach links und rechts. iPd: Padding, Abstand vom Control nach oben und unten. } procedure Decorate(hdc: HDC; r: TRect; penColor: TColor; iPw, iSp, iPd: ShortInt); // Änderung: iPw, iSp, iPd begin with TCanvas.Create do try Handle := hdc; Pen.Width := iPw; Pen.Color := penColor; InflateRect(r, iSp, iPd); Brush.Style := bsClear; Rectangle(r); finally Free; end; end; procedure TForm1.Label1MouseEnter(Sender: TObject); begin with Sender as TLabel do Decorate(GetDC(Handle), BoundsRect, clHighlight, 1, 10, 20); end; procedure TForm1.Label1MouseLeave(Sender: TObject); begin with Sender as TLabel do Decorate(GetDC(Handle), BoundsRect, self.Color, 1, 10, 20); end; |
Re: Selektionsrahmen um Komponente zeichnen?
Zitat:
|
Re: Selektionsrahmen um Komponente zeichnen?
Hallo,
Zitat:
Gruß Hawkeye |
Re: Selektionsrahmen um Komponente zeichnen?
alternativ mit dem richtigen Namen nochmal googlen...der 3. Treffer bringt dich direkt auf die Seite der Komponente ;)
Gruß Frank |
Re: Selektionsrahmen um Komponente zeichnen?
@_frank: Da war die Auskunft von @Hawkeye219 wesentlich hilreicher. Ohne den Punkt am Ende klappte es. Nur muss man das erst mal wissen.
Danke @Hawkeye219. Jetzt klappt es wirklich, ohne den Punkt hinten. Werde mir jetzt sowohl die SizeCtrls holen, als auch @MichaelLinden-s neue Version für den Rahmen. Experimentieren werde ich aber erst nach einer Runde Schlaf, damit ich müder Sack dann ausgeschlafen und mit frischem Elan die Quelltexte studieren und an einer eigenen Lösung basteln kann. Kann ich dann gerne hier reinstellen. |
Re: Selektionsrahmen um Komponente zeichnen?
Hallo,
Den Quelltext der Unit SizeControl muss ich zunächst in Ruhe studieren. Bei dem Testprojekt zur Unit funktioniert das Vergrößern, Verkleinern und Verschieben einwandfrei. Bisher sehe ich, das erstens die Marker als Klasse mit eigenen Ereignissen realisiert sind (TSizeBtn), während meine DrawMarkers-Routine einfach einen Rahmen mit diesen Markern zeichnet. Weiterhin dürfte die Mehode RegisterControl die Methode sein, welche die Komponente in den Designer einfügt. Targets sind wahrscheinlich die im Designer befindlichen, also bereits eingefügten Controls. Jetzt brauch ich Zugriff auf das aktuell sekektierte, um dessen Eigenschaften beeinflussen zu können. Ich schätze, Targets[Index] ist mein Freund. Mich hat dennoch der Ehrgeiz gepackt und daher gibt es erst mal ne kleine Revanche für Routine von Michael Linden. Ich habe die Routine DrawMarkers genannt. Michael Lindens Routine zeichnet einfach einen Rahmen. DrawMarkers zeichnet auch die Handles, die auch im Formdesigner von Delphi bei der selektierten Komponente zu sehen sind. Ich habe dazu Michael Lindens Routine einach erweitert.
Delphi-Quellcode:
procedure DrawMarkers(hdc: HDC; r: TRect; penColor: TColor);
const PENWIDTH = 2; var Anchors: TRect; VertMid: Integer; HorzMid: Integer; index: Integer; begin with TCanvas.Create do try Handle := hdc; Pen.Width := PENWIDTH; Pen.Color := penColor; InflateRect(r, PENWIDTH, PENWIDTH); Brush.Style := bsClear; //Das Rechteck als Rahmen Rectangle(r); HorzMid := (r.Right - r.Left) div 2; VertMid := (r.Bottom - r.Top) div 2; //---------- Hier werden die Marker gezeichnet ------------- for index:=7 downto 0 do case index of 7: begin //Links oben Anchors.Left := r.Left - 2; Anchors.Right := r.Left + 3; Anchors.Top := r.Top - 2; Anchors.Bottom := r.Top + 3; Rectangle(Anchors); end; 6: begin //Mitte oben Anchors.Left := Anchors.Left + HorzMid; Anchors.Right := Anchors.Left + 4; Rectangle(Anchors); end; 5: begin //Rechts oben Anchors.Left := r.Right - 2; Anchors.Right := Anchors.Left + 4; Rectangle(Anchors); end; 4: begin //Rechts Mitte Anchors.Top := Anchors.Top + VertMid; Anchors.Bottom := Anchors.Top + 4; Rectangle(Anchors); end; 3: begin //Links Mitte Anchors.Left := r.Left - 2; Anchors.Right := Anchors.Left + 4; Rectangle(Anchors); end; 2: begin //Links unten Anchors.Top := r.Bottom - 2; Anchors.Bottom := Anchors.Top + 4; Rectangle(Anchors); end; 1: begin //Unten Mitte Anchors.Left := Anchors.Left + HorzMid; Anchors.Right := Anchors.Left + 4; Rectangle(Anchors); end; 0: begin //Unten rechts Anchors.Left := r.Right - 2; Anchors.Right := Anchors.Left + 4; Rectangle(Anchors); end; end; //---------- Hier wurden die Marker gezeichnet ------------- finally Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 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 by Thomas Breitkreuz