![]() |
Edit.text 5 mal Blinken lassen
Hallo ich möchte den Text einer TEdit Komponente 5 mal Blinken lassen.
Ich habe dazu einen TTimer in dem folgendes Steht
Delphi-Quellcode:
1. Nur Blendet er Hier nur das Edit feld ein und aus....
procedure TForm3.Timer1Timer(Sender: TObject);
begin Edit1.Visible := not edit1.Visible; end; 2. Er soll es nur 5 mal Blinken lassen..... kann mir jemand weiter helfen?? |
AW: Edit.text 5 mal Blinken lassen
Laß einen Zähler mit laufen und wenn der die 10 (5x an + 5x aus) erreicht schaltest Du den Timer wieder ab.
|
AW: Edit.text 5 mal Blinken lassen
Und wenn nur der Text "blinken" soll, speicherst Du ihn zwischen und wechselst zwischen dem gespeichtern String und einem Leerstring.
|
AW: Edit.text 5 mal Blinken lassen
... oder änderst die Fontfarbe oder Farbe des Editfeldes.
|
AW: Edit.text 5 mal Blinken lassen
Oder alles zusammen, das sollte auf jeden Fall auffallen.
|
AW: Edit.text 5 mal Blinken lassen
Okay habe es hin bekommen
Delphi-Quellcode:
So jetzt müsste nur noch der Text verschwinden und nicht die komplette edit box?
procedure TForm3.Timer1Timer(Sender: TObject);
begin Edit1.Visible := not edit1.Visible; timer1.Tag:=Timer1.tag+1; if timer1.Tag=strtoint(edit1.Text)*2 then timer1.Enabled:=false; end; |
AW: Edit.text 5 mal Blinken lassen
Zitat:
|
AW: Edit.text 5 mal Blinken lassen
Zitat:
Delphi-Quellcode:
Geht es auch noch kürzer?
var
st:Tstringlist; ... ... procedure TForm3.Timer1Timer(Sender: TObject); begin if Edit1.Text=st.Strings[0] then Edit1.text:=''else if edit1.text='' then Edit1.Text:=st.Strings[0] ; timer1.Tag:=Timer1.tag+1; if timer1.Tag=strtoint(st.strings[0])*2 then timer1.Enabled:=false; end; |
AW: Edit.text 5 mal Blinken lassen
Also nachdem du ja schon die Einrückungen entfernt hast könntest du
Delphi-Quellcode:
noch in
Timer1
Delphi-Quellcode:
und
T1
Delphi-Quellcode:
in
Edit1
Delphi-Quellcode:
umbenennen, das spart nochmal ein paar Buchstaben.
E1
|
AW: Edit.text 5 mal Blinken lassen
Zitat:
|
AW: Edit.text 5 mal Blinken lassen
Wozu eigentlich eine Stringliste? Ich würde das ungefähr so angehen:
Delphi-Quellcode:
type
TfrmBlinkDemo = class(TForm) edtBlink: TEdit; tmrBlink: TTimer; btnBlink: TButton; procedure tmrBlinkTimer(Sender: TObject); procedure btnBlinkClick(Sender: TObject); private { Private-Deklarationen } FOriginalString: string; FCounter: integer; procedure Blink; public { Public-Deklarationen } end; ... const BLINKCOUNT = 5; { TfrmBlinkDemo } procedure TfrmBlinkDemo.Blink; begin FCounter := 0; FOriginalString := edtBlink.Text; tmrBlink.Enabled := true; end; procedure TfrmBlinkDemo.btnBlinkClick(Sender: TObject); begin Blink; end; procedure TfrmBlinkDemo.tmrBlinkTimer(Sender: TObject); begin inc(FCounter); if Odd(FCounter) then edtBlink.Text := '' else edtBlink.Text := FOriginalString; if FCounter >= BLINKCOUNT * 2 then tmrBlink.Enabled := false; end; |
AW: Edit.text 5 mal Blinken lassen
Und seit 2009 kann man auch alles in Chinesisch schreiben, womit man dann mehr als nur 26 "Namen" zur Verfügung hat.
|
AW: Edit.text 5 mal Blinken lassen
lol Danke:) immer diese iron.......... .
Noch ne andere Frage Ich erstelle in der FORM3 :) 20 TEDIT Komponenten. nun sollen diese bei keypress die Timer Komponenten auslösen
Delphi-Quellcode:
procedure TForm3.SpielerKeyPress(Sender: TObject; var Key: Char);
var Spieler:TEdit; begin Spieler:=TEdit(Sender); st:=Tstringlist.Create; st.Add(Spieler.text); if Key = #13 then begin key := #0;//schalt sound ab Timer1.Interval := 500; timer1.Enabled:=true; end; end;
Delphi-Quellcode:
Wie Übergebe ich hier Statt edit1.text den sender der den Timer ausgelöst hat?
procedure TForm3.Timer1Timer(Sender: TObject);
begin //habe es hier auch schon mit Spieler:=TEDIT(Sender)( versucht) und edit1 mit Spieler ersetzt //klappt aber nicht if Edit1.Text = st.Strings[0] then Edit1.text := '' else if Edit1.text = '' then Edit1.Text := st.Strings[0]; timer1.Tag := Timer1.tag+1; if timer1.Tag = strtoint(st.strings[0])*2 then timer1.Enabled := false; end; |
AW: Edit.text 5 mal Blinken lassen
Indem du dir den "Sender" merkst?
Zitat:
Rate mal, wer dieses Ereignis auslöst und demnach in diesem Sender drin steht?
Delphi-Quellcode:
.
ShowMessage((Sender as TComponent).Name);
Wenn du dir nicht sicher bist, daß der Typ stimmt, dann verwende niemals harte Konvertierungen ala
Delphi-Quellcode:
, sondern nur weiche Konvertierungen ala
TTyp(...)
Delphi-Quellcode:
:!:
(... as TTyp)
|
AW: Edit.text 5 mal Blinken lassen
Selber merken? Und ist Dir aufgefallen, dass Du bei jedem Tastendruck eine neue Stringliste erzeugst, die nirgends freigegeben wird?
|
AW: Edit.text 5 mal Blinken lassen
Wenn ich das richtig verstanden habe: Deine Edits teilen sich alle den gleichen Handler (SpielerKeyPress). Jetzt möchtest du mit dem jeweiligen Edit direkt bei Tastendruck einmal direkt machen, was der Timer normalerweise periodisch macht, oder erst beim nächsten Timer-Tick?
|
AW: Edit.text 5 mal Blinken lassen
Wenn ich den Code richtig verstehe, soll mit einem "RETURN" im jeweiligen Edit der Timer aktiviert werden.
|
AW: Edit.text 5 mal Blinken lassen
Zitat:
Habe jetzt den Sender in stringlist gespeichert. und will ihm im Timer wieder nutzen
Delphi-Quellcode:
procedure TForm3.Timer1Timer(Sender: TObject);
var Spieler:TEdit; begin Spieler.name:=st.strings[1]; if Spieler.Text = st.Strings[0] then Spieler.text := '' else if Spieler.text = '' then Spieler.Text := st.Strings[0]; timer1.Tag := Timer1.tag+1; if timer1.Tag = strtoint(st.strings[0])*2 then timer1.Enabled := false; end; Er gibt mir aber fehler aus |
AW: Edit.text 5 mal Blinken lassen
Natürlich, denn Du tust nicht das, was Du eigentlich meinst. Im Moment weist Du der Eigenschaft Name der nicht erzeugten Instanz Spieler einen Wert zu, möchtest aber doch eigentlich die Instanz ermitteln, die den Namen hat. Das ginge z.B. mit FindComponent oder FindControl, aber ich würde mir überlegen, wieso man den Namen speichern sollte, wenn man sich auch die Instanz selbst merken kann.
|
AW: Edit.text 5 mal Blinken lassen
Zitat:
|
AW: Edit.text 5 mal Blinken lassen
Schau Dir doch meinen Code von
![]()
Delphi-Quellcode:
private
{ Private-Deklarationen } FOriginalString: string; FCounter: integer; FEditDasBlinkenSoll: TEdit; // <-- 1 2 3 keine Hexerei procedure Blink; |
AW: Edit.text 5 mal Blinken lassen
Danke für die Hilfe und da ich Faul und unverbesserlich bin habe ich es so gemacht
Delphi-Quellcode:
procedure TForm3.SpielerKeyPress(Sender: TObject; var Key: Char);
var Spieler:TEdit; begin Spieler:=TEdit(Sender); st:=Tstringlist.Create; st.Add(Spieler.text); st.Add((Sender as TComponent).Name); if Key = #13 then begin key := #0;//schalt sound ab Timer1.Interval := 500; Timer1.Enabled := true; end; end; procedure TForm3.Timer1Timer(Sender: TObject); var Spieler: TEdit; begin Spieler := TEdit(FindComponent(st.Strings[1])); if Spieler.Text = st.Strings[0] then Spieler.text := '' else if Spieler.text = '' then Spieler.Text := st.Strings[0]; Timer1.Tag := Timer1.tag+1; if Timer1.Tag = strtoint(st.Strings[0])*2 then Timer1.Enabled := false; if Timer1.Enabled=false then st.Free; if Timer1.Enabled=false then Timer1.Tag:=0; end; |
AW: Edit.text 5 mal Blinken lassen
Da bin ich mal gespannt, wieviel Tasten Du drücken kannst, bevor Dir der Speicher ausgeht.
|
AW: Edit.text 5 mal Blinken lassen
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
steht der alte Text und nicht die Anzahl?
st.Strings[0]
Ach ja, den StringListe könnte man natürlich im OnCreate erstellen und im OnDestroy freigeben. Oder man verwendet gleich zwei einzelne String-Konstanten (oder, halt einen String und einen Objektzeiger). Zitat:
Und natürlich ist dann auch der "alte" Text weg, wenn man grade dann nochmal drückt, während der Text grade ausgeblendet ist. Das
Delphi-Quellcode:
wurde doch bestimmt auch schon mehrmals erwähnt?
if ... = false
|
AW: Edit.text 5 mal Blinken lassen
Zitat:
Ich würde dieses Problem generell lösen. Es gibt da also etwas, was innerhalb eines bestimmten Zeit-Intervalls x mal wiederholt werden soll.
Delphi-Quellcode:
Einen Timer an TTimedActions.Trigger verdrahtet und die ActionItems feuern dann, wenn denen danach ist.
TTimedActionItem = class
property Interval : cardinal; property Count : cardinal; property OnExecute : TNotifyEvent; procedure Trigger; end; TTimedActions = class property ActionCount : Integer; property Actions[index:Integer] : TTimedActionItem; procedure AddAction( Action : TTimedActionItem ); procedure Trigger; end; procedure TTimedActions.Trigger; var LIdx : integer; begin for LIdx := 0 to ActionCount - 1 do Actions[LIdx].Trigger; end; |
AW: Edit.text 5 mal Blinken lassen
Und dann die TTimedActions-Instanz in einer Stringliste ablegen :mrgreen:
|
AW: Edit.text 5 mal Blinken lassen
was passiert eigentlich so speichermäßig genau wenn man folgendes macht?
Delphi-Quellcode:
SL := TStringList.Create;
SL.Add('test'); SL := TStringList.Create; SL := TStringList.Create; SL := TStringList.Create; |
AW: Edit.text 5 mal Blinken lassen
Damit hast Du 4 Stringlist-Instanzen, von denen Du noch eine ansprechen und freigeben kannst, der Rest verbraucht nur noch Speicher und bringt Dir nichts.
|
AW: Edit.text 5 mal Blinken lassen
Ausprobieren?
Delphi-Quellcode:
4 Speicherlecks (die ersten 3 Stringlisten und der eine String)
ReportMemoryLeaksOnShutdown := True;
SL := TStringList.Create; SL.Add('test'); SL := TStringList.Create; SL := TStringList.Create; SL := TStringList.Create; ShowMessage(SL.Text); SL.Free; |
AW: Edit.text 5 mal Blinken lassen
also sollte ich die Tstringliste nur in der Form create setzen damit siw nur einmal erstellt wird.
Mit dem st.free gebe ich nur die gespeichert strings frei richtig wäre das so etwas korreker...??? |
AW: Edit.text 5 mal Blinken lassen
Du brauchst doch nur eine Instanz, da bietet es sich an, sie im OnCreate anzulegen und im OnDestroy wieder freizugeben. Und das Free gibt die Instanz und die enthaltenen Strings frei.
|
AW: Edit.text 5 mal Blinken lassen
Zitat:
Delphi-Quellcode:
st := TStringList.Create; // Instanz erzeugen (Referenz in st)
st.Add( 'hallo' ); // einen string anfügen st.Clear; // alle strings entfernen st.Free; // Instanz zerstören st.Add( 'kaputt' ); // jetzt kommt ein Zugriffsfehler, weil es keine Instanz mehr an der Referenz-Adresse gibt st := TStringList.Create; // Instanz erzeugen st := TStringList.Create; // Instanz erzeugen, ABER die Referenz zur vorherigen Instanz ist jetzt futsch -> Speicherleck |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 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