![]() |
OnMouseDown Methode hinzufügen->Label wird per Code erste
Hi,
dies ist meine erste Frage und ich hoffe ich bin hier richtig. Falls es schon Themen dieser Art geben sollte, entschuldige ich mich. Gefunden habe ich nemlich keine und welche Suchbegriffe ich verwenden könnte ist mir auch nicht ganz klar. :oops: Ich möchte bei Labels, die zur Laufzeit erstellt werden, die OnMouseDown Methode hinzufügen.
Delphi-Quellcode:
So lasse ich mir meine Labels erstellen und dies funktioniert einwandfrei.
MyLabel:=TLabel.Create(Form3);
with MyLabel do begin ProcessPath(memo1.Lines[i], laufwerk, verzeichnisse, datei); Caption:=datei; Name:='label'+IntToStr(i); left:=15; top:=10+i*13; width:=10; height:=10; visible:=true; parent:=form3; end; Doch wie kann ich jetzt die besagte Methode hinzufügen? Ich brauche die Methode, um die Labels später per Maus verschieben zu können, so wie es in der Entwicklungszeit möglich ist. Ich benutze Delphi 2005 und bin Schüler der Emil-Possehl-Schule, ich hoffe, dass ihr alle Infos habt und mir helfen könnt. Vielen Dank schonmal Mit freundlichen Grüßen Danyel S. |
Re: OnMouseDown Methode hinzufügen->Label wird per Code e
Ich mache das bei einer Sprachenanzeige so:
Delphi-Quellcode:
Du mußt nur OnClick in OnMouseDown ändern und dann die entsprechende Prozedur erstellen, die dann das macht, was du willst.
for Idx := 0 to Cnt - 1 do begin
NewItem:= TMenuItem.Create(Self); NewItem.Caption:=LanguagesSL[Idx]; NewItem.Tag:=Idx; NewItem.OnClick:=SelLanguage; LanguageSprache1.Add(NewItem); //Sprachen an Menueintrag dranhängen end; |
Re: OnMouseDown Methode hinzufügen->Label wird per Code e
Hallo,
... das Ganze für Buttons (ist aber im Prinzip genau das Gleiche) : ![]() |
Re: OnMouseDown Methode hinzufügen->Label wird per Code e
BTW:
Erst einmal herzlich willkommen in der DP. :dp: Gruss und schönes Wochende Wolfgang |
Re: OnMouseDown Methode hinzufügen->Label wird per Code e
Zitat:
OOPS verklickt, sorry [/Edit] |
Re: OnMouseDown Methode hinzufügen->Label wird per Code e
:wall:
oh man ^^ Da hätt ich auch selber draufkommen können, vielen dank. :gruebel: hmm aber mir war mal so, dass wenn ich selbst die Proceduren geschrieben hatte, die nicht erkannt worden, sondern erst nachdem ich diese durch doppelklicken bei dem bestimmten Ereigniss hinzugefügt hatte. Naja, wie dem auch sein, ich werde es sofort testen und noch mal vielen Dank für die schnellen Antworten. Wenn es interessiert kann ich mein Projekt auch gerne mal vorstellen. MfG Danyel S. EDIT: hmm also ich habe das nun folgendermaßen hinzugefügt:
Delphi-Quellcode:
Wenn ich auf Form3 nun aber die procedure dafür erstellen möchte mit:
for i:=0 to memo1.Lines.Count-1 do
begin MyLabel:=TLabel.Create(Form3); with MyLabel do begin ProcessPath(memo1.Lines[i], laufwerk, verzeichnisse, datei); Caption:=datei; Name:='label'+IntToStr(i); left:=15; top:=10+i*13; width:=10; height:=10; visible:=true; parent:=form3; onmousedown; onmouseup; onmousemove; end; end;
Delphi-Quellcode:
oder
procedure mylabel.onmousedown;
begin move:=true; end;
Delphi-Quellcode:
zeigt er mir mylabel oder halt label1 rot an, da diese im moment logischerweise nicht
procedure label1.onmousedown;
begin move:=true; end; existieren. Entweder bin ich zu doof oder einfach inzwischen zu Müde, aber im Moment habe ich keine Ideen mehr. :coder2: Für erneute Hilfe wäre ich dankbar, denn wenn das klappt, ist mein Programm zu 99% fertig. EDIT2 ich bin glaube ich echt zu müde, habe meinen vermutlichen Fehler gefunden. Muss den On-Ereignissen ja eigene Proceduren zuweisen ^^
Delphi-Quellcode:
Anscheind bin ich zu doof, die Proceduren dafür zum Laufen zu bekommen :wiejetzt:
for i:=0 to memo1.Lines.Count-1 do
begin MyLabel:=TLabel.Create(Form3); with MyLabel do begin ProcessPath(memo1.Lines[i], laufwerk, verzeichnisse, datei); Caption:=datei; Name:='label'+IntToStr(i); left:=15; top:=10+i*13; width:=10; height:=10; visible:=true; parent:=form3; onmousedown:=aktivieren; onmouseup:=deaktivieren; onmousemove; end; end; end; end; procedure TForm3.aktivieren(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin move:=true; end; |
Re: OnMouseDown Methode hinzufügen->Label wird per Code e
Deinem letzten Codeschnipsel nach hast Du ja das Prinzip soweit erkannt. Ansonsten einfach nochmal mit einem zur Entwurfszeit plazierten Label anschauen.
Alle deine Label rufen jetzt natürlich das gleiche "Aktivieren" und auch das gleiche "MouseMove" auf. Hä wie jetzt - und dann.. dann gibt es da diesen seltsamen Parameter "Sender" - und der hilft. Wenn eines der Label den Event auslöst, dann übergibt es als Sender "self", der Sender gibt also immer das Label an welches gerade angeklickt wurde. Mit "(Sender as TLabel).TopLeft" kannst Du dann beispielsweise die Position verändern. Tipp: Die momentanen globalen Mauskoordinaten Mouse.Cursorpos im Verhältnis zu denen beim Aktivieren verraten Dir welche Bewegung stattfand. Dich interessiert also vermutlich viel mehr "MoveAbWo" als "Move=True". Grüsse, Dirk |
Re: OnMouseDown Methode hinzufügen->Label wird per Code e
Ah danke, vielen dank.
Werd mich nochmal genauer mit den Sendern beschäftigen und es die Tage weiter probieren, wenn der Klausurstress vorbei ist. Und nein, von wo die Bewegung stattfindet ist eig relativ egal, denn sobald man auf das Label klickt, wird move auf true gesetzt. Wenn move auf true gesetzt ist, dann wird die labelposition zusammen mit der Maus bewegt. Sobald ich es geschafft, oder andere Fragen habe, melde ich mich. Bis dahin noch nen schönen Abend. PS Damit es zu keinen Missverständnissen kommt: Ich möchte die erstellten Labels während der Laufzeit mit der Maus bewegen, dazu soll beim OnMouseDown eine Variable, in meinem Fall MOVE auf TRUE gesetzt werden. Beim OnMouseMove werden die LEFT und TOP Werte mit denen der Maus vergrößert oder verkleinert. Dies geschieht aber nur bei gedrückter Maustaste (MOVE=TRUE). Beim OnMouseUp soll MOVE wieder auf FALSE gesetzt werden. EDIT Wenn ich es wie Zeras vorgeschlagen hatte mache und eine Procedure unten dranhänge und oben bei der Labelerstellung der OnMouseDown Procedure meine eigene zuweise, dann zeigt er mir diese rot an und sagt dass diese nicht vorhanden ist. EDIT :wall: So, endlich konnte ich weitere Tests machen, doch verliefen diese nicht nach meinen Vorstellungen. Ich habe mir das Thema angeguckt wo durch ein Array Buttons erzeugt werden und muss zugeben, dass ich dort nicht alles verstehe. Das mit den Sendern ist mir noch nicht gänzlich schlüssig. Bin ich richtig in der Annahme, dass ich eine eigene Variable für den Sender erstellen muss, so wie es in dem Thema zu sehen ist? Muss ich beim Erstellen der Labels dieser Variable etwas zuweisen? Wenn ja was? Aber da macht sich in mir die Vermutung breit, dass das nicht funktionieren kann, da die Variable dann nur auf das zuletzt erstellte Label bezug hat, da durch dieses die Variable zuletzt geändert wurde. Momentan bin ich auf dem Holzweg und mir scheint, als ob ich das Brett vor dem Kopf nicht allzu schnell wegbekommen werde. Ich wäre sehr dankbar, wenn mir jemand eine etwas genauere Erklärung oder andere, ähnliche Themen liefern könnte. Hmm ich überlege gerade die Erstellung der Labels mit einem Array zu verbinden, dh, dass erst die Anzahl der zu erstellenden Labels überprüft wird und somit die Endgrenze des Arrays festgelegt wird, ist das sinnvoll das so umzubauen? Danke euch für eure Geduld mit mir :oops: |
Re: OnMouseDown Methode hinzufügen->Label wird per Code e
Ich hoffe, dass es in Ordnung ist, dass ich einen Doppelpost mache, da meine letzte Antwort bereits so lang ist.
Nochmal zum Verständnis. Kann ich in jeder Procedure herausfinden, von wem diese aufgerufen wurde? Das MOVE auf TRUE gesetzt wird, soll bei jedem erstellten Label passieren via OnMouseDown. Beim OnMouseMove soll die Veränderung nur bei dem Label auftreten, welches diese Procedure aufgerufen hat. Bin ich also richtig in der Annahme, dass ich in der besagten Procedure herausfinden kann, wer diese aufgerufen hat? Wie funktioniert dies? Komme grad gedanklich nicht weiter. |
Re: OnMouseDown Methode hinzufügen->Label wird per Code e
Bei Event-Methoden ja ( Parameter Sender)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 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