Grafik: Resize mit Fangecken

Rund um die LCL und andere Komponenten
Antworten
gbl
Beiträge: 5
Registriert: Sa 26. Mär 2011, 10:35

Grafik: Resize mit Fangecken

Beitrag von gbl »

Hallo,

weis nicht recht wie ich mich ausdrücken soll: In der IDE gibt es ja die Möglichkeit, plazierte GUI Elemente zu verschieben und zu resizen. Eine solche Komponente suche ich.

Kennt jemand eine solche VCL/LCL?


LG
Günter

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Grafik: Resize mit Fangecken

Beitrag von MAC »

Also das kann man eigentlich Recht einfach,Objektorientiert handeln, da man nur ein Paar MouseEvents (MouseMove,...) dafür brauch...
Da die IDE aber selbst mit FreePascal geschrieben ist wird es bestimmt auch irgendwo in deren Quellcode zu finden sein...

Code: Alles auswählen

Signatur := nil;

aldicek
Beiträge: 37
Registriert: Do 6. Mär 2008, 12:48
OS, Lazarus, FPC: WinXP/Mint13KDE (Lazarus 1.0.8 FPC 2.6.2)
CPU-Target: 64 Bit
Wohnort: Halle (Saale)

Re: Grafik: Resize mit Fangecken

Beitrag von aldicek »

Hallo gbl!

Kann es sein, dass du eine Lösung suchst, Nachfahren von TWinControl so zu verschieben, dass sie z.B. aneinander oder an den Rändern deines Parentforms "anklicken" (ich kenne es als Magnetfunktion von einem der letzten WinAmp-Clients)?
Wenn ja, wäre ich an einer allgemeinen Lösung auch interessiert. ;o)

Gruß
Aldi

gbl
Beiträge: 5
Registriert: Sa 26. Mär 2011, 10:35

Re: Grafik: Resize mit Fangecken

Beitrag von gbl »

Hi,

ja so in etwa. Das Andocken an Magnetlinien wäre dann der Bonus. "Jeder" GUI Editor macht das eigentlich vor. Habe allerdings kein eigenes Example gefunden. Und so fit bin ich in diesem Bereich auch nicht. MS-Visio ist auch ein gutes Beispiel für meine Frage.

Vielleicht programmiert MAC ein Quick'n Dirty Example....


LG
Günter

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Grafik: Resize mit Fangecken

Beitrag von Scotty »

Ich benutze in meinem Spiel ein verschiebbares und größenveränderbares Panel. Vielleicht hilft dir das...
http://scrabble.svn.sourceforge.net/vie ... xt%2Fplain" onclick="window.open(this.href);return false;

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Grafik: Resize mit Fangecken

Beitrag von MAC »

Quick & Dirty kommt sofort :D

Also ich hab nur einmal den Grobaufbau gemacht.
Im Grunde fängt deine Komponente erstmal alle OnMouseDown on MouseMove und OnMouseUp events ab (es müsste auch nur mit onMouseMove über shift gehen, aber naja...). Das Beispiel UmgehungsFunktion_OnMouseMove zeigt dann wie du die Procedure doch weiter verwenden kannst...
Verschieben funktioniert in alle richtungen, kein Bounding check oder Gridcheck oder soetwas in der Art.
Es is möglich das Panel in die Breite zu vergrößern, verkleinern, wenn man 5 picel von rand entfernt klickt und dann verschiebt...
In die Höhe im momment nicht , ist aber analog dazu...
Zum starten brauchst du nur eine leere Form und ein OnFormCreate-Ereignis...

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,ExtCtrls;
 
type
 
  { TForm1 }
 
  TMyPanel = class;
 
  TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
   MyPanel:TMyPanel;
  end;
 
  { TMyPanel }
 
  TMyPanel = class(TPanel)
  private
  mpos:TPoint;
  run:boolean;
  procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  procedure MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  procedure MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
  public
  UmgehungsFunktion_OnMouseMove:TMouseMoveEvent;
  constructor Create(TheOwner: TComponent); override;
  end;
 
var
  Form1: TForm1; 
 
implementation
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
MyPanel := TMyPanel.Create(Form1);
MyPanel.Parent := Form1;
end;
 
{$R *.lfm}
 
{ TMyPanel }
 
procedure TMyPanel.MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
run := True;
mpos := Point(x,y);
 
end;
 
procedure TMyPanel.MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
run := False;
end;
 
procedure TMyPanel.MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer
 );
begin
if not run then exit;
if x < 5 then
   begin
   Width := Width + mpos.x - x;
   Left:=Left - mpos.x + x;
   end
  else
   begin
   if x > Width-5 then
      begin
      Width := Width - mpos.x + x;
      mpos.x := x;
      end
     else
      begin
      Left:=Left - mpos.x + x;
      end;
   end;
Top := Top - mpos.y + y;
if assigned(UmgehungsFunktion_OnMouseMove) then UmgehungsFunktion_OnMouseMove(Sender,Shift,x,y);
end;
 
constructor TMyPanel.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
run := False;
UmgehungsFunktion_OnMouseMove := nil;
Self.OnMouseDown:= @MouseDown;
Self.OnMouseUp:= @MouseUp;
Self.OnMouseMove:= @MouseMove;
end;
 
end.

Code: Alles auswählen

Signatur := nil;

Antworten