Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Edit.text 5 mal Blinken lassen (https://www.delphipraxis.net/179208-edit-text-5-mal-blinken-lassen.html)

Natcree 20. Feb 2014 10:55

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:
procedure TForm3.Timer1Timer(Sender: TObject);
begin
Edit1.Visible := not edit1.Visible;
end;
1. Nur Blendet er Hier nur das Edit feld ein und aus....
2. Er soll es nur 5 mal Blinken lassen.....

kann mir jemand weiter helfen??

Union 20. Feb 2014 10:58

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.

DeddyH 20. Feb 2014 11:01

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.

Union 20. Feb 2014 11:02

AW: Edit.text 5 mal Blinken lassen
 
... oder änderst die Fontfarbe oder Farbe des Editfeldes.

DeddyH 20. Feb 2014 11:03

AW: Edit.text 5 mal Blinken lassen
 
Oder alles zusammen, das sollte auf jeden Fall auffallen.

Natcree 20. Feb 2014 11:04

AW: Edit.text 5 mal Blinken lassen
 
Okay habe es hin bekommen
Delphi-Quellcode:
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;
So jetzt müsste nur noch der Text verschwinden und nicht die komplette edit box?

Neutral General 20. Feb 2014 11:06

AW: Edit.text 5 mal Blinken lassen
 
Zitat:

Zitat von Natcree (Beitrag 1248741)
So jetzt müsste nur noch der Text verschwinden und nicht die komplette edit box?

Zum Glück hat DeddyH eine Zeitmaschine und konnte die Antwort darauf posten bevor du die Frage gestellt hast :P

Natcree 20. Feb 2014 11:17

AW: Edit.text 5 mal Blinken lassen
 
Zitat:

Und wenn nur der Text "blinken" soll, speicherst Du ihn zwischen und wechselst zwischen dem gespeichtern String und einem Leerstring.
Delphi-Quellcode:
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;
Geht es auch noch kürzer?

Der schöne Günther 20. Feb 2014 11:30

AW: Edit.text 5 mal Blinken lassen
 
Also nachdem du ja schon die Einrückungen entfernt hast könntest du
Delphi-Quellcode:
Timer1
noch in
Delphi-Quellcode:
T1
und
Delphi-Quellcode:
Edit1
in
Delphi-Quellcode:
E1
umbenennen, das spart nochmal ein paar Buchstaben.

Union 20. Feb 2014 11:53

AW: Edit.text 5 mal Blinken lassen
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1248746)
Also nachdem du ja schon die Einrückungen entfernt hast könntest du
Delphi-Quellcode:
Timer1
noch in
Delphi-Quellcode:
T1
und
Delphi-Quellcode:
Edit1
in
Delphi-Quellcode:
E1
umbenennen, das spart nochmal ein paar Buchstaben.

Nicht zu vergessen TForm3 -> F :evil: Und überhaupt, man kann doch bei Pascal auch alles in eine Zeile schreiben, dann spart man sich die Umbrüche.

DeddyH 20. Feb 2014 11:59

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;

himitsu 20. Feb 2014 12:01

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.

Natcree 20. Feb 2014 12:01

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:
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;
Wie Übergebe ich hier Statt edit1.text den sender der den Timer ausgelöst hat?

himitsu 20. Feb 2014 12:09

AW: Edit.text 5 mal Blinken lassen
 
Indem du dir den "Sender" merkst?

Zitat:

Delphi-Quellcode:
procedure TForm3.Timer1Timer(Sender: TObject);
begin
//habe es hier auch schon mit Spieler:=TEDIT(Sender)( versucht) und edit1 mit Spieler ersetzt

Kein Wunder.

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:
TTyp(...)
, sondern nur weiche Konvertierungen ala
Delphi-Quellcode:
(... as TTyp)
:!:

DeddyH 20. Feb 2014 12:10

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?

Der schöne Günther 20. Feb 2014 12:18

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?

DeddyH 20. Feb 2014 12:25

AW: Edit.text 5 mal Blinken lassen
 
Wenn ich den Code richtig verstehe, soll mit einem "RETURN" im jeweiligen Edit der Timer aktiviert werden.

Natcree 20. Feb 2014 12:36

AW: Edit.text 5 mal Blinken lassen
 
Zitat:

Wenn ich den Code richtig verstehe, soll mit einem "RETURN" im jeweiligen Edit der Timer aktiviert werden.
Ja so ist es gemeint.

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

DeddyH 20. Feb 2014 12:41

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.

Natcree 20. Feb 2014 12:43

AW: Edit.text 5 mal Blinken lassen
 
Zitat:

wenn man sich auch die Instanz selbst merken kann.
Wie mache ich das?

DeddyH 20. Feb 2014 12:45

AW: Edit.text 5 mal Blinken lassen
 
Schau Dir doch meinen Code von hier noch einmal an. Da könnte man doch noch ein privates Feld hinzufügen.
Delphi-Quellcode:
private
    { Private-Deklarationen }
    FOriginalString: string;
    FCounter: integer;
    FEditDasBlinkenSoll: TEdit; // <-- 1 2 3 keine Hexerei
    procedure Blink;

Natcree 20. Feb 2014 13:11

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;

DeddyH 20. Feb 2014 13:15

AW: Edit.text 5 mal Blinken lassen
 
Da bin ich mal gespannt, wieviel Tasten Du drücken kannst, bevor Dir der Speicher ausgeht.

himitsu 20. Feb 2014 13:19

AW: Edit.text 5 mal Blinken lassen
 
Zitat:

Delphi-Quellcode:
  Spieler:=TEdit(Sender);
  st.Add(Spieler.text);

  st.Add((Sender as TComponent).Name);

Man könnte sich natürlich für eine Variante entscheiden und Beides "gleich" behandeln.


Zitat:

Delphi-Quellcode:
  if Spieler.Text = st.Strings[0] then Spieler.text := '' else
  if Spieler.text = ''           then Spieler.Text := st.Strings[0];

Wozu der zweite Vergleich?

Zitat:

Delphi-Quellcode:
  if Timer1.Tag = strtoint(st.Strings[0])*2 then Timer1.Enabled := false;

Ich dachte in
Delphi-Quellcode:
st.Strings[0]
steht der alte Text und nicht die Anzahl?

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:

Da bin ich mal gespannt, wieviel Tasten Du drücken kannst, bevor Dir der Speicher ausgeht.
Bei jedem Tastendruck wird eine neue Stringliste erstellt, aber nur die "Letzte" gibst du wieder frei.
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:
if ... = false
wurde doch bestimmt auch schon mehrmals erwähnt?

Sir Rufo 20. Feb 2014 13:30

AW: Edit.text 5 mal Blinken lassen
 
Zitat:

Zitat von DeddyH (Beitrag 1248781)
Da bin ich mal gespannt, wieviel Tasten Du drücken kannst, bevor Dir der Speicher ausgeht.

Ein gutes Auto braucht viel Sprit und ein gutes Programm braucht viel Speicher.

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:
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;
Einen Timer an TTimedActions.Trigger verdrahtet und die ActionItems feuern dann, wenn denen danach ist.

DeddyH 20. Feb 2014 13:33

AW: Edit.text 5 mal Blinken lassen
 
Und dann die TTimedActions-Instanz in einer Stringliste ablegen :mrgreen:

baumina 20. Feb 2014 13:49

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;

DeddyH 20. Feb 2014 13:51

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.

himitsu 20. Feb 2014 14:00

AW: Edit.text 5 mal Blinken lassen
 
Ausprobieren?
Delphi-Quellcode:
  ReportMemoryLeaksOnShutdown := True;
  SL := TStringList.Create;
  SL.Add('test');
  SL := TStringList.Create;
  SL := TStringList.Create;
  SL := TStringList.Create;
  ShowMessage(SL.Text);
  SL.Free;
4 Speicherlecks (die ersten 3 Stringlisten und der eine String)

Natcree 20. Feb 2014 14:21

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...???

DeddyH 20. Feb 2014 14:23

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.

Sir Rufo 20. Feb 2014 14:52

AW: Edit.text 5 mal Blinken lassen
 
Zitat:

Zitat von Natcree (Beitrag 1248794)
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...???

Nein

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