![]() |
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? |
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:
Delphi-Quellcode:
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...
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; |
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) |
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 |
AW: Während Programm läuft
Zitat:
hierbei stehe ich auf dem schlauch |
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:
ein und schaue was passiert.
ShowMessage('Geklickt wurde: '+meinControl.ClassName);
|
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? |
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: |
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: |
AW: Während Programm läuft
Zitat:
Man muss alles dreimal lesen, um es zu verstehen! |
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. |
AW: Während Programm läuft
OK, Ich habe es kapiert! Ist es so jetzt besser? :D
@Daniel: Ja, werde ich, in Zukunft, machen! |
AW: Während Programm läuft
Zitat:
|
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 |
AW: Während Programm läuft
Zitat:
|
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'; |
AW: Während Programm läuft
Wie hast du denn die procedure
Delphi-Quellcode:
deklariert?
MeinEigenesOnClick
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 |
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; |
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; |
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:
und Hier mal der Quellcod der ganzen Unit
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;
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. |
AW: Während Programm läuft
Sicher, dass die Fehlermeldung immer noch die gleiche ist? Die Eigenschaft
Delphi-Quellcode:
gibt es bei einer TEdit Komponente nicht. Dort heißt sie
Caption
Delphi-Quellcode:
. Lies dir doch bitte nocheinmal die Fehlermeldung durch. Ich habe deinen Code mal so übernommen und bei mir erscheint keine Fehlermeldung beim Kompilieren.
Text
|
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 |
AW: Während Programm läuft
Juhu ich habs es muss
Delphi-Quellcode:
heißem, wie hier steht
Edit1.OnClick:=@MeinEigenesOnClick;
![]() |
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:
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.
Edit1.OnClick := @MeinEigenesEventOnClick;
Edit: Naja hat sich ja dann erledigt. PS: Google hat anscheinend doch etwas gebracht. |
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??
|
AW: Während Programm läuft
OnMouseDown und OnMouseUp könntest du dafür benutzen.
|
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?? |
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