Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Während Programm läuft (https://www.delphipraxis.net/176042-waehrend-programm-laeuft.html)

Finki 8. Aug 2013 09:56

Während Programm läuft
 
...und weiter geht die fragerei

Hey

zuerst möchte ich anmerken das ich mit sehr intensiv mit der suche im interent beschäfftigt habe aber nicht fündig geworden bin,
also wende ich mich wieder einmal an das forum meines vertrauens.

ich möchte eine komponente (Edit/Label/Memo) welche ich erstellt habe (während das programm läuft) auswählen wenn möglich mit doppleklick auf das Edit/Label/Memo können und dann davon direkt die position ändern können..

mir fallen da nur dinge ein mit ixtausenden variablen und beziehungen könnt ihr mir tipps geben bzw. sagen wie man das möglichst enfach machen kann?

Der schöne Günther 8. Aug 2013 10:02

AW: Während Programm läuft
 
Du kannst mehrere Komponenten auf dem Formular-Designer markieren und denen alle die gleiche onClick-Prozedur geben. Die Variable Sender ist ein Verweis auf die Komponente auf welche geklickt wurde, die müsstest du nach TComponent (oder TWinControl?) casten, damit du die Positionen ändern kannst.

Beispiel:
  1. Gewünschte Komponenten auswählen
  2. Im Objektinspektor bei Ereignisse Doppelklick ins "onClick"-Feld
  3. Im Quell-Text-Editor dann beispielsweise so:

Delphi-Quellcode:
procedure TForm9.Button1Click(Sender: TObject);
var
   meinControl: TWinControl;
begin

   if (Sender is TWinControl) then
      meinControl := (Sender as TWinControl)
   else
      Exit;

   meinControl.Left := meinControl.Left - 2;

end;
Damit schiebst du beim Klick auf jede Komponente (Memo, Button, Edit, ...) das Teil zwei Pixel nach links. Wozu so etwas gut ist weiß ich zwar auch nicht, aber möglicherweise habe ich die Frage auch falsch verstanden...

Finki 8. Aug 2013 10:36

AW: Während Programm läuft
 
ähm ja gut einbisschen schon

und zwar läuft des so ab

ich klicken auf einen button (btnMove)

-> dann wähle ich eine Komponente aus (txtFeld)
-> dann klicke ich auf einen ArrowButton (btnli)
-> dann wird das txtFeld (welches aber keinen wirklichen namen hat) nach links verschoben um irgendeinen Faktor (der zb aus einen zahlen txtFeld genommen wird)

Der schöne Günther 8. Aug 2013 10:46

AW: Während Programm läuft
 
Aber was genau daran ist jetzt dein Problem?

Du hast ja eine klare Vorstellung, was davon kannst du schon einmal umsetzen? Ich habe in den letzten Tagen kein komplettes Profil über deine Kentnisse erstellt (das überlasse ich den 100% verfassungskonform arbeitenden Nachrichtendiensten), aber ich würde glauben, dass du doch daran alles selbst hinbekommen könntest 8-)

- Move-Modus mittels Button an- und ausschalten
- Jetzt neu: Mit einer einzigen Methode herausfinden, welche Komponente man gedrückt hat
- Die eben ausgewählte Komponente nun auf dem Formular verschieben

Finki 8. Aug 2013 10:52

AW: Während Programm läuft
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1223993)
- Jetzt neu: Mit einer einzigen Methode herausfinden, welche Komponente man gedrückt hat

und genau das ist das problem
hierbei stehe ich auf dem schlauch

Der schöne Günther 8. Aug 2013 10:58

AW: Während Programm läuft
 
Hast du was ich eben geschrieben habe nicht mal nachgestellt? Ereignis-Methoden wie "onClick" werden immer mit einem Parameter "Sender" aufgerufen. Das ist die Form-Komponente, die gerade geklickt worden ist.

Im Beispiel steht in der Variable meinControl eben diese Komponente dann drin. Du kannst das überprüfen, indem du dir beispielsweise noch einmal dann durch eine Messagebox anzeigen lässt, ob es ein TButton, ein TEdit oder sonstwas war.

Füge nach dem "Nach links-Setzen" einfach noch ein
Delphi-Quellcode:
ShowMessage('Geklickt wurde: '+meinControl.ClassName);
ein und schaue was passiert.

Finki 8. Aug 2013 11:03

AW: Während Programm läuft
 
Au man ach jetzt ich bin echt iwie blöd

also ich muss dem auch nicht sagen auf was geklickt wurde des weiß der automatisch?

bcvs 8. Aug 2013 11:57

AW: Während Programm läuft
 
"Er" (wer ist das überhaupt?) weiß erst mal gar nichts.
Die Komponente, die die gerade laufende Ereignis-Methode (in deinem Fall OnClick) aufgerufen hat, wird im Paramter Sender übergeben.

Gewöhn dir mal eine exaktere Terminologie an, sonst gibt es nur Missverständnisse.:warn:

Finki 8. Aug 2013 12:08

AW: Während Programm läuft
 
Gut ich werde darauf achten! aber ja das meinte ich gut hat sich das auch geklärt vielen dank :D
:zwinker:

TiGü 8. Aug 2013 14:09

AW: Während Programm läuft
 
Zitat:

Zitat von bcvs (Beitrag 1224009)
Gewöhn dir mal eine exaktere Terminologie an, sonst gibt es nur Missverständnisse.:warn:

Und eine vernünftige Zeichensetzung!
Man muss alles dreimal lesen, um es zu verstehen!

Daniel 8. Aug 2013 14:24

AW: Während Programm läuft
 
@Finki:
Und ich habe auch noch eine Bitte :stupid: Sei doch bitte so gut und passe den Titel dieses Threads an. "Während Programm läuft" ist nicht besonders konkret.
Danke Dir.

Finki 8. Aug 2013 14:47

AW: Während Programm läuft
 
OK, Ich habe es kapiert! Ist es so jetzt besser? :D

@Daniel:

Ja, werde ich, in Zukunft, machen!

haentschman 8. Aug 2013 15:21

AW: Während Programm läuft
 
Zitat:

Ja, werde ich, in Zukunft, machen!
... Daniel meinte eher gleich und hier. :zwinker: Du kannst das im ersten Beitrag ändern...

Finki 8. Aug 2013 17:39

AW: Während Programm läuft
 
ähm, ich hab da noch so eine frage:

ich versteh das doch noch nicht, wie soll des gehen das ich auf den move button drücke, wie soll der button dann "wissen" auf welches Objekt gedrückt wurde

Olli73 8. Aug 2013 19:14

AW: Während Programm läuft
 
Zitat:

Zitat von Finki (Beitrag 1224057)
ich versteh das doch noch nicht, wie soll des gehen das ich auf den move button drücke, wie soll der button dann "wissen" auf welches Objekt gedrückt wurde

Das musst du dir natürlich vorher merken.

Finki 10. Aug 2013 11:12

AW: Während Programm läuft
 
Dann kommt bei mir der fehler

newformframe.pas(94,36) Error: Wrong number of parameters specified for call to "MeinEigenesOnClick"

und das ist der Code

Delphi-Quellcode:
txtzahl:=txtzahl+1;
      Edit1 :=TEdit.Create(Form3);
      Edit1.Parent := Form3;
      Edit1.AutoSize:=true;
      Edit1.SetBounds(mausx,mausy,50,32);
      Edit1.Refresh;
      Edit1.Visible:=true;
      Edit1.Enabled:=true;
      Edit1.Caption:=Form4.Edit1.Text;
      with Edit1 do
      begin
      OnClick := MeinEigenesOnClick; //der liegt angeblich in dieser Zeile
      end;
      Edit1.Name:='txtFeld' + inttostr(txtzahl);
      Form4.Memo1.Lines.Text:='0';

Aviator 10. Aug 2013 11:24

AW: Während Programm läuft
 
Wie hast du denn die procedure
Delphi-Quellcode:
MeinEigenesOnClick
deklariert?

Bei der Deklaration muss ein Sender als TObject übergeben werden.

Delphi-Quellcode:
procedure MeinEigenesOnClick(Sender: TObject); // Deklaration im Interface Teil
...
Edit1.OnClick := MeinEigenesOnClick; // Zuweisung des Ereignisses

Finki 10. Aug 2013 11:29

AW: Während Programm läuft
 
Delphi-Quellcode:
...

public
    procedure MeinEigenesOnClick(Sender: TObject);
 end;

var
  Form3: TForm3;

{ TForm3 }
procedure TForm3.MeinEigenesOnClick(Sender: TObject);
var
   meinControl: TWinControl;
begin
 if (Sender is TWinControl) then
      meinControl := (Sender as TWinControl)
   else
      Exit;

   meinControl.Left := meinControl.Left - 2;
end;

Aviator 10. Aug 2013 11:35

AW: Während Programm läuft
 
Du darfst dein Ereignis nicht im public Bereich sondern nur im "globalen" Bereich deklarieren. Also auch dort, wo deine ganzen Komponenten aufgelistet werden.

Beispiel:

Delphi-Quellcode:
type
  TAdvancedSettingsFrm = class(TForm)
    SettingsTree: TJvSettingsTreeView;
    procedure SaveBtnClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

Finki 10. Aug 2013 11:41

AW: Während Programm läuft
 
immer noch der gleiche Fehler

newformframe.pas(94,40) Error: Wrong number of parameters specified for call to "MeinEigenesOnClick"

Delphi-Quellcode:
type

  { TForm3 }

  TForm3 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormChangeBounds(Sender: TObject);
    procedure FormClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure MeinEigenesOnClick(Sender: TObject);

  private
    { private declarations }
  public

  end;
und Hier mal der Quellcod der ganzen Unit

Delphi-Quellcode:
unit NewFormFrame;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ComCtrls, Buttons, ExtCtrls;

type

  { TForm3 }

  TForm3 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormChangeBounds(Sender: TObject);
    procedure FormClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure MeinEigenesOnClick(Sender: TObject);

  private
    { private declarations }
  public

  end;

var
  Form3: TForm3;

  txtzahl : integer;
  lblzahl : integer;
  absetzen : boolean;

implementation
uses
  FormularFrame, newformframetools;

{ TForm3 }
procedure TForm3.meineigenesOnClick(Sender: TObject);
var
   meinControl: TWinControl;
begin
 if (Sender is TWinControl) then
      meinControl := (Sender as TWinControl)
   else
      Exit;

   meinControl.Left := meinControl.Left - 2;
end;

procedure TForm3.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  Form4.Close;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  txtzahl :=0;
  lblzahl :=0;
  Memo1.Lines.Clear;
  absetzen :=false
end;

procedure TForm3.FormClick(Sender: TObject);
var
  toolmemo1i : integer;
  mausx, mausy : integer;
  Edit1 : TEdit;
  Label1 : TLabel;

begin
  toolmemo1i:=strtoint(Form4.Memo1.Lines[0]);

  mausx:=Mouse.CursorPos.x-Form3.Left-3;
  mausy:=Mouse.CursorPos.y-Form3.Top-50;

  case toolmemo1i of
  0: begin
  end;
  1: begin
      txtzahl:=txtzahl+1;
      Edit1 :=TEdit.Create(Form3);
      Edit1.Parent := Form3;
      Edit1.AutoSize:=true;
      Edit1.SetBounds(mausx,mausy,50,32);
      Edit1.Refresh;
      Edit1.Visible:=true;
      Edit1.Enabled:=true;
      Edit1.OnClick:=MeinEigenesOnClick;
      Edit1.Caption:=Form4.Edit1.Text;
      Edit1.Name:='txtFeld' + inttostr(txtzahl);
      Form4.Memo1.Lines.Text:='0';

      Memo1.Lines.Add('1');
      Memo1.Lines.Add(Edit1.Name);
      Memo1.Lines.Add(Edit1.Text);
      Memo1.Lines.Add(inttostr(Edit1.BoundsRect.Left));
      Memo1.Lines.Add(inttostr(Edit1.BoundsRect.Top));
      Memo1.Lines.Add(inttostr(Edit1.Width));
      Memo1.Lines.Add(inttostr(Edit1.Height));
      Memo1.Lines.Add('');
   //   Memo1.Lines.Text:=inttostr(Form4.txtSize.Caption);
      Form3.Refresh;
  end;
  2: begin
      lblzahl:=lblzahl+1;
      Label1 :=TLabel.Create(Form3);
      Label1.Parent := Form3;
      Label1.AutoSize:=true;
      Label1.SetBounds(mausx,mausy,50,32);
      {if lblzahl>1 then
      begin
        for j:=1 to lblzahl do
        lblFeld
      end;}

      Label1.Refresh;
      Label1.Visible:=true;
      Label1.Enabled:=true;
      Label1.Font.Size:=strtoint(Form4.txtSize.Text);
      Label1.Caption:=Form4.Edit1.Text;
      Label1.Name:='lblFeld' + inttostr(lblzahl);
      Form4.Memo1.Lines.Text:='0';
      Form3.Refresh;

      Memo1.Lines.Add('2');
      Memo1.Lines.Add(Label1.Name);
      Memo1.Lines.Add(Label1.Caption);
      Memo1.Lines.Add(inttostr(Label1.BoundsRect.Left));
      Memo1.Lines.Add(inttostr(Label1.BoundsRect.Top));
      Memo1.Lines.Add(inttostr(Label1.Width));
      Memo1.Lines.Add(inttostr(Label1.Height));
      Memo1.Lines.Add('');

  end;
  3: begin

  end;
  end;
end;

procedure TForm3.FormChangeBounds(Sender: TObject);
begin
  Form4.SetBounds(Form3.Left-125,Form3.Top,115,201);
end;

procedure TForm3.Button1Click(Sender: TObject);

begin

   button1.Caption:=boolToStr(move);
end;

procedure TForm3.FormShow(Sender: TObject);
begin
  Form3.Caption:='Formular Editor';

  Form4:= TForm4.Create(Form3);
  Form4.ShowOnTop;
  Form4.Caption:='Tools';
  Form4.SetBounds(Form3.Left-125,Form3.Top,115,296);
end;

{$R *.lfm}

end.

Aviator 10. Aug 2013 11:51

AW: Während Programm läuft
 
Sicher, dass die Fehlermeldung immer noch die gleiche ist? Die Eigenschaft
Delphi-Quellcode:
Caption
gibt es bei einer TEdit Komponente nicht. Dort heißt sie
Delphi-Quellcode:
Text
. Lies dir doch bitte nocheinmal die Fehlermeldung durch. Ich habe deinen Code mal so übernommen und bei mir erscheint keine Fehlermeldung beim Kompilieren.

Finki 10. Aug 2013 11:54

AW: Während Programm läuft
 
ja, hab gerade des mit dem .Text verbessert und ausprobiert. Und da kam wieder folgende Fehlermeldung:

newformframe.pas(21,46) Hint: Parameter "CloseAction" not used
newformframe.pas(94,40) Error: Wrong number of parameters specified for call to "MeinEigenesOnClick"
newformframe.pas(44,18) Hint: Found declaration: TForm3.MeinEigenesOnClick(TObject);
newformframe.pas(173) Fatal: There were 1 errors compiling module, stopping

Finki 10. Aug 2013 12:03

AW: Während Programm läuft
 
Juhu ich habs es muss
Delphi-Quellcode:
Edit1.OnClick:=@MeinEigenesOnClick;
heißem, wie hier stehthttp://wiki.freepascal.org/FPC_messa...s_specified/de

Aviator 10. Aug 2013 12:05

AW: Während Programm läuft
 
Hmm, habe gerade gemerkt, dass du ja mit Lazarus arbeitest.

Bei Lazarus muss man das Ganze glaube ich so schreiben:

Delphi-Quellcode:
Edit1.OnClick := @MeinEigenesEventOnClick;
Versuch das mal noch. Wenn es funktioniert, denke ich, dass du das schneller gefunden hättest wenn du Google benutzen würdest. Nicht nur immer irgendwo nachfragen sondern selbst recherchieren hilft meist auch noch viel weiter, da du vielleicht auch noch andere hilfreiche Tipps zu anderen Dingen bei deiner Suche im Netz findest.


Edit: Naja hat sich ja dann erledigt. PS: Google hat anscheinend doch etwas gebracht.

Finki 10. Aug 2013 12:26

AW: Während Programm läuft
 
Ich hab da noch eine kurze Frage, und zwar mit welchem Ereigniss sagt man, so lange die Linkemaustaste gedrückt ist??

Aviator 10. Aug 2013 12:29

AW: Während Programm läuft
 
OnMouseDown und OnMouseUp könntest du dafür benutzen.

Finki 10. Aug 2013 12:35

AW: Während Programm läuft
 
Hab ich gemacht, und klappt aber ich muss um das Objekt 10 nach links zu bekommen 5x mal drücken.

also meincontrol.Left:= meinControl.Left-2; und das 5x, kann ich irgendwie sagen so lange gedrückt??

Aviator 10. Aug 2013 12:40

AW: Während Programm läuft
 
Sorry, aber: Neue(s) Frage/Thema --> Neuer Thread


Alle Zeitangaben in WEZ +1. Es ist jetzt 00: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