Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Button + Edit Feld - zur Laufzeit entfernen? (https://www.delphipraxis.net/105249-button-edit-feld-zur-laufzeit-entfernen.html)

atgis 18. Dez 2007 17:30


Button + Edit Feld - zur Laufzeit entfernen?
 
Hallo,

Ich bastle gerade an einem kleinem Programm, welches simple Wav-Dateien abspielen soll. Das ist ja soweit auch kein Problem...über das Edit Feld gebe ich den Pfad ein und drücke auf Play! Funktioniert!

Nun möchte ich aber gerne mehrere Sounds abspielen können. Also brauche ich mehrere Edit-Felder und Abspielbuttons.

Nun möchte ich die gern dynamisch über eine Button (+,-) hinzufügen/entfernen.

http://s6.directupload.net/images/071218/cwdk2siw.jpg


Wie mache ich das? Objekte während der Laufzeit hinzufügen?


Das Edit-Feld in meinem Programm heißt "Edit1" der Button "BitBtn1"...diese müssten doch dann beim hinzufügen (also klick aufs +) hochgezählt werden? Also Edit2, Edit3 usw...


Oder gibt es eine viele bequemere und einfacher Lösung als meine Idee?

MfG

DeddyH 18. Dez 2007 17:31

Re: Button + Edit Feld - zur Laufzeit hinzufügen?
 
Pack doch eine ListBox drunter und fülle sie aus dem Edit ;)

atgis 18. Dez 2007 17:34

Re: Button + Edit Feld - zur Laufzeit hinzufügen?
 
Ja hab ich auch schon gedacht...aber ich wollte gerne eine Lösung mit Buttons (o.ä.)...damit man schnell einen Sound abspielen kann.

Wenn man erst einen Sound in einer ListBox suchen müsste, würde es schon zulang dauern :wink:

mkinzler 18. Dez 2007 17:35

Re: Button + Edit Feld - zur Laufzeit hinzufügen?
 
Delphi-Quellcode:
Inc(Index);
with TEdit.Create( self) do
begin
   Parent := Self;
   Name := 'Edit'+IntToStr( index);
   Left := ...
   ...
end;
with TButton.Create( self) do
begin
   Parent := Self;
   Name := 'Edit'+IntToStr( index);
  Caption := ...
   Left := ...
   ...
end;

DeddyH 18. Dez 2007 17:37

Re: Button + Edit Feld - zur Laufzeit hinzufügen?
 
Und hinterher schön wieder freigeben ;)

P.S.: Ob ich jetzt den entsprechenden Abspiel-Button suchen muss oder den Dateinamen in einer ListBox, ist IMHO Jacke wie Hose :mrgreen:

Apollonius 18. Dez 2007 17:39

Re: Button + Edit Feld - zur Laufzeit hinzufügen?
 
Freigeben muss man Komponenten nicht, wenn man einen Owner hat.

atgis 18. Dez 2007 17:39

Re: Button + Edit Feld - zur Laufzeit hinzufügen?
 
Wer das "Nippelboard" von TV-Total kennt, weiß was ich bezwecken möchte... :zwinker:

mkinzler 18. Dez 2007 17:45

Re: Button + Edit Feld - zur Laufzeit hinzufügen?
 
Zitat:

Zitat von Apollonius
Freigeben muss man Komponenten nicht, wenn man einen Owner hat.

Was in meinem Beispiel der Fall ist.

atgis 18. Dez 2007 22:22

Re: Button + Edit Feld - zur Laufzeit hinzufügen?
 
So richtig funktioniert es noch nicht...

Delphi-Quellcode:
//+
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
inc(i);
with TEdit.Create(self) do
begin
   Parent:= Self;
   Name:= 'Edit'+IntToStr(i);
   Left:= 8;
   Top:= 32;
   Width:= 233;
end;
with TBitBtn.Create(self) do
begin
   Parent:= Self;
   Name:= 'Edit'+IntToStr(i);
   Caption:= 'Play';
   Left:= 244;
   Top:= 32;
   Width:= 22;
   Height:= 22;

end;
end;
Undzwar erzeugt es ja das Edit-Feld und nennt es Edit+i (=Edit1). Dann erzeugt es den Button und nennt ihn auch Edit+i (=Edit1) -> dadurch bekomme ich eine Exception, da das Objekt schon vorhanden ist...

Benenne ich einen Namen um...also z.b. Editblabla...kann ich zwar einmal beide Objekte erzeugen, doch beim 2. mal wieder der Fehler wie oben. Editblabla1 ist schon vorhanden...

Mh...

Crazy Ivan 18. Dez 2007 22:28

Re: Button + Edit Feld - zur Laufzeit hinzufügen?
 
weil du dem edit den selben namen wie dem bitbtn gibst.

richtig:

Delphi-Quellcode:
Name:= 'Edit'+IntToStr(i);
für das edit

Delphi-Quellcode:
Name:= 'BitBtn'+IntToStr(i);
für den button

bei dir ist das bei beiden gleich ==> beide haben den selben namen ==> exception

atgis 18. Dez 2007 22:55

Re: Button + Edit Feld - zur Laufzeit hinzufügen?
 
Ja ich weiß...habe es umbenannt...jetzt kann ich auch 1mal meine neuen Objekte hinzufügen. Klicke ich aber nochmal auf das + will es wieder ein Edit1 erstellen, was ja schon vorhanden ist!

http://s2.directupload.net/images/071218/7kfu73cj.jpg

bitsetter 18. Dez 2007 23:14

Re: Button + Edit Feld - zur Laufzeit hinzufügen?
 
Das ist ja auch kein Wunder, da i bei dir eine lokale Variable ist. Dann schon eher die Variable im private Abschnitt deklarieren.

atgis 19. Dez 2007 13:30

Re: Button + Edit Feld - zur Laufzeit hinzufügen?
 
Ok Danke... ich hab noch eine Frage wegen der Ausrichtung der neuen Objekte...

Left und Top müssen ja sozusagen auch immer wieder mit hochgezählt werden. Ich hab das jetzt erstmal so gemacht:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

begin

inc(i);

with TEdit.Create(self) do
 begin
   Parent:= Self;
   Name:= 'Edit'+IntToStr(i);
   Left:= 8;
   Top:= 7+(i)*(25);     //i würde ja nur 1 Pixel Abstand ergeben...deswegen mal 25 für 25px...
   Width:= 233;
 end;
with TBitBtn.Create(self) do
 begin
   Parent:= Self;
   Name:= 'BitButn'+IntToStr(i);
   Caption:= 'Play';
   Left:= 244;
   Top:= 7+(i)*(25);    //...deswegen mal 25 für 25px
   Width:= 22;
   Height:= 22;
 end;
end;
Ist das so i.o.? Oder sollte ich das besser anders machen?


Wie kann ich mit den "-" Button die jeweils letzten beiden Objekte löschen?

bitsetter 19. Dez 2007 16:44

Re: Button + Edit Feld - zur Laufzeit hinzufügen?
 
Zitat:

Zitat von atgis
Wie kann ich mit den "-" Button die jeweils letzten beiden Objekte löschen?

Die einfache aber unschöne Variante wäre mit FindComponent
Delphi-Quellcode:
var
  Edt: TEdit;
begin
  Edt:= TEdit(self.FindComponent('Edit'+IntToStr(i)));
  if System.Assigned(Edt) then
  begin
    dec(i);
    Edt.Free;
  end;
besser wäre jedoch wenn du deine dynamisch erzeugten Komponenten in einer TComponentList oder zumindest in einem Array verwaltest, als sie jedesmal erst zu suchen.

atgis 19. Dez 2007 19:54

Re: Button + Edit Feld - zur Laufzeit entfernen?
 
Aber leider kann ich so den Button nicht löschen...
Delphi-Quellcode:
  Bt:= TBitBtn(self.FindComponent('BitBtn'+IntToStr(i)));
  if System.Assigned(Bt) then
  begin
    dec(i);
    Bt.Free;
  end;
EDIT: Geht doch :wall: hatte Edt.Free geschrieben... Gut Danke für den Tipp...

So...jetzt will ich ja per Klick auf den Button einen Sound abspielen...den jeweiligen Pfad zur Datei, bekomme ich aus dem Edit Feld... also Edit+IntToStr(i)...

Aufrufen will ich die Prozedure so:
Delphi-Quellcode:
with TBitBtn.Create(self) do
 begin
   Parent:= Self;
   Name:= 'BitBtn'+IntToStr(i);
   Caption:= '>';
   Left:= 243;
   Top:= 6+(i)*(25);
   Width:= 22;
   Height:= 22;
   OnClick:=ButtonClick; //<--- hier der Aufruf
 end;
end;
So spielt es aber immer den Sound aus dem 1.Edit Feld ab...ist ja klar
Delphi-Quellcode:
procedure TForm1.ButtonClick(Sender: TObject);
begin
 sndPlaySound(PChar(Edit.Text),SND_ASYNC);
end;
Also müsste ich schon beim erzeugen des Buttons
Delphi-Quellcode:
sndPlaySound(PChar(Edit + i.Text),SND_ASYNC);
mit einen OnClick Ereignis zuordnen?

Wie mache ich das?

OnClick:= ?

bitsetter 19. Dez 2007 22:25

Re: Button + Edit Feld - zur Laufzeit entfernen?
 
Man könnte den Tag vom TBitBtn benutzen, dazu müsste man den vorigen Code noch etwas anpassen.
Delphi-Quellcode:
var
  Edt: TEdit;
begin
  inc(i);

  Edt:= TEdit.Create(self);
  with Edt do
  begin
     Parent:= Self;
     Name:= 'Edit'+IntToStr(i);
     Left:= 8;
     Top:= 6 + i * 25;
     Width:= 233;
  end;

  with TBitBtn.Create(self) do
  begin
     Parent:= Self;
     Name:= 'BitBtn'+IntToStr(i);
     Caption:= '>';
     Left:= 243;
     Top:= Edt.Top;
     Width:= 22;
     Height:= 22;
     Tag:= cardinal(Edt);//<--
     OnClick:=ButtonClick;
  end;
Dann auslesen:
Delphi-Quellcode:
procedure TForm1.ButtonClick(Sender: TObject);
begin
  if Sender is TBitBtn then
    Showmessage(TEdit(TBitBtn(Sender).Tag).Text);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz