![]() |
Bei jedem Klick einen Text für bestimmte Zeit auf die Form setzten
Hallo,
Vorerst: Entschuldigung für die unpräzise Überschrift, ich weiß nicht wie ich mein Problem beschreiben soll :oops: Ich würde gerne bei einer bestimmten Aktion (z.B. jedem Klick auf die Form, oder jedes mal wenn ich Leertaste drücke) etwas erscheinen lassen (z.B. einen Text oder ein Image). Ich nehme als Beispiel jetzt mal den Text. Immer wenn ich Leertaste drücke, erscheint der Text an einer bestimmten Stelle auf der Form und bewegt sich auf der Form um 100 Pixel nach oben. Danach verschwindet er wieder. Ich möchte, dass es keine wirkliche maximale Anzahl an Texten gibt, die gleichzeitig auf der Form sind. Um so schneller und mehr ich die Leertaste drücke, desto mehr Texte befinden sich auf der Form. Ich habe allerdings keine Ahnung, wie ich so etwas von der Art realisieren kann. Ich weiß auch nicht, wie ich nach dem Problem suchen soll, da ich es nicht wirklich mit einigen Stickwörtern beschreiben kann :( Ich würde mich sehr über eine Antwort freuen! :) Gruß, Astobix |
AW: Bei jedem Klick einen Text für bestimmte Zeit auf die Form setzten
Ich brauche nicht mehr als 2 Sekunden, um das zu realisieren.
Warum gibt es Leute, die wirklich für Alles fremde Hilfe brauchen!? |
AW: Bei jedem Klick einen Text für bestimmte Zeit auf die Form setzten
Erzeuge ein Label und setze es auf die Form.
Dieses Label hängst du auch in eine Liste. Ein Timer arbeitet beim OnTimer Event diese Liste ab und verändert die Position. Wenn ein Label diese (100) Schritte hinter sich hat, dann entferne es aus der Liste und zerstöre es. Eine Möglichkeit diese Anzahl an verbleibenden Schritten zu speichern wäre die Tag-Eigenschaft von TLabel.
Delphi-Quellcode:
procedure TMyForm.AddNewLabel( const ACaption : string );
var LLabel : TLabel; begin LLabel := TLabel.Create( nil ); LLabel.Caption := ACaption; LLabel.Top := Random( Self.ClientHeight - 100 ) + 100; LLabel.Left := 50; LLabel.Parent := Self; LabelList.Add( LLabel ); end; procedure TMyForm.LabelTimerTimer( Sender : TObject ); var LIdx : Integer; LLabel : TLabel; begin LIdx := 0; while Lidx < LabelList.Count do begin LLabel := LabelList.Items[LIdx] as TLabel; if LLabel.Tag = 0 then begin LabelList.Delete( LIdx ); end else begin LLabel.Top := LLabel.Top - 1; LLabel.Tag := LLabel.Tag - 1; Inc( LIdx ); end; end; end; Zitat:
Konntest du das schon immer so schnell? |
AW: Bei jedem Klick einen Text für bestimmte Zeit auf die Form setzten
Wenn es nur um Texte/Grafiken geht, dann kannst du natürlich auch soviele auf ein Canvas zeichnen, wie du willst
und diese natürlich auch beliebig "verschieben" (neu zeichnen). ![]() ![]() |
AW: Bei jedem Klick einen Text für bestimmte Zeit auf die Form setzten
Vielen Dank für die schnelle Antwort!
Mein Problem war, dass ich noch nie mit Listen gearbeitet habe, deswegen bin ich nicht auf die Idee gekommen, es auf die Weise zu probieren :) Wie kann ich denn jetzt den einzelnen Labels z.B. ein OnClick Ereigniss zuweisen? Sorry für die dummen Fragen, aber ich hab keine Idee wie :/ Edit: Hab die Lösung selbst gefunden :) |
AW: Bei jedem Klick einen Text für bestimmte Zeit auf die Form setzten
Indem man der Eigenschaft
Delphi-Quellcode:
eine Methode zuweist.
TLabel.OnClick
Anbieten würde sich das ja beim Erzeugen des Labels |
AW: Bei jedem Klick einen Text für bestimmte Zeit auf die Form setzten
Delphi-Quellcode:
Wenn Du den Modus auf Delphi statt objfpc gestellt hast, kann das @ entfallen.
DeinLabel.OnClick := @SomeTNotifyEventMethod;
|
AW: Bei jedem Klick einen Text für bestimmte Zeit auf die Form setzten
Okay, mit mehreren Labels klappt das gut soweit, vielen Dank.
Eine letzte Frage für Heute habe ich aber noch, denn wenn ich versuche statt einem Label das Ganze mit einem Image zu machen, bekomme ich eine Errormeldung.
Code:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
); begin case Key of 37: PlayerIMG.Left:=PlayerIMG.Left-10; 39: PlayerIMG.Left:=PlayerIMG.Left+10; $20: ErzeugeLaser('.\gfx\Laser.jpg'); end; end;
Code:
procedure TForm1.ErzeugeLaser(const Picture: String);
var ILaser:TImage; begin ILaser := TImage.Create( nil ); ILaser.Picture.LoadFromFile(Picture); ILaser.Width:=8; ILaser.Height:=16; ILaser.Left:=PlayerIMG.Left+12; ILaser.Top:=PlayerIMG.Top-32; ILaser.Parent:=Self; ILaser.Tag:=10; LaserList.Add(ILaser); end;
Code:
Letzendlich habe ich genau den gleichen Code benutzt, nur eben auf ein Image übertragen. Doch mir wird eine Fehlermeldung in der Zeile
procedure TForm1.LaserTimerTimer(Sender: TObject);
var i: Integer; ILaser: TImage; begin i := 0; while i < LaserList.Count do begin ILaser := LaserList.Items[i] as TImage; if ILaser.Top = 0 then begin LaserList.Delete(i); end else begin ILaser.Top:=ILaser.Top - 5; Inc(i); end; end; end;
Code:
angezeigt.
while i < LaserList.Count do
|
AW: Bei jedem Klick einen Text für bestimmte Zeit auf die Form setzten
Und diese Errormeldung ist so geheim, dass du alle erschiessen müsstest, wenn du die hier kundtust? :roll:
|
AW: Bei jedem Klick einen Text für bestimmte Zeit auf die Form setzten
Project PSpace.exe raised exception class EAccessViolation with message 'Access violation at address 00462C60 in module 'PSpace.exe'. Read of address 00000008'. Process stopped. Use Step or Run to continue.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 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