Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Probleme mit Listbox Einträgen (https://www.delphipraxis.net/115832-probleme-mit-listbox-eintraegen.html)

Die Muhkuh 21. Jun 2008 23:42

Re: Probleme mit Listbox Einträgen
 
Hi,

hab mir nochmals den Code angeguckt.

Ich rede jetzt von der Main.pas.

Bisschen gekürzt sieht es so aus:

Delphi-Quellcode:
procedure TForm2.Button2Click(Sender: TObject);
var
  lIndex: Integer;
begin
  Err := ShellExecute(Form2.Handle,
      'open',
      Pchar(MeinArray[lIndex].RealFileName),
      NIL,
      NIL,
      SW_SHOWNORMAL);
end;
Das Problem ist hier einfach, dass lIndex nichts zugewiesen wurde. Dem musst Du etwas zuweisen. Höchstwahrscheinlich den ItemIndex der ListBox1.

[edit] Ich sehe sogar noch mehr!

Du hast einmal in der Name.pas ein MeinArray definiert und einmal in der Main.pas ein MeinArray definiert. Du befüllst nur das in der Name.pas. Das das nicht in der Main.pas funktioniert, ist ja nun klar :zwinker: [/edit]

@Detlef: Fang mal Deinen Vogel wieder ein :tongue:

DeddyH 21. Jun 2008 23:47

Re: Probleme mit Listbox Einträgen
 
*Aaaaaarrrrgghh*
Zitat:

Zitat von DeddyH
Außerdem würde ich für Typen, die ich in mehreren Formularen brauche, eine eigene Unit anlegen und in allen Formularunits einbinden, die diese Typen verwenden.

Das gilt auch für globale Variablen, sofern man denn meint, solche zu brauchen.

Johnny Bravo 21. Jun 2008 23:50

Re: Probleme mit Listbox Einträgen
 
lIndex ist doch initialisiert mit [/delphi]:= ListBox1.ItemIndex;[delphi]

aber wie soll ich denn dann den Eintrag von der Name.pas in die Main.pas bekommen? Das Edit wo der Alternativnamen geschrieben wird, sitzt auf der Name.pas. Die Listbox, in der dieser Name hineinkommt, sitzt auf der Main.pas.
ich dachte, es wäre ein array, was sich beide units teilen.

wie lautet dann der korrekt Pchar bei Shellexecute?

Wie gesagt, ich benutze ein Array zum erstenmal.

Die Muhkuh 21. Jun 2008 23:53

Re: Probleme mit Listbox Einträgen
 
Zitat:

Zitat von Johnny Bravo
ich dachte, es wäre ein array, was sich beide units teilen.

Dann musst Du es auch als solches behandeln.

Einfach bei beiden definieren is' nich' :stupid:

Du könntest in der Name.pas alles was dieses Array betrifft rauslöschen (nur die Definition!!!) und im Code dann (testweise, da unsaubere Lösung!) anstatt MeinArray Form2.MeinArray schreiben.

Und den lIndex in der Main.pas:

Delphi-Quellcode:
lIndex := ListBox1.ItemIndex

DeddyH 21. Jun 2008 23:56

Re: Probleme mit Listbox Einträgen
 
Ich brauch jetzt ne Pennpause. Cobra (Manuel), übernehmen Sie :lol:

Die Muhkuh 21. Jun 2008 23:57

Re: Probleme mit Listbox Einträgen
 
Bin schon fleißig dabei, Chef :mrgreen:

Johnny Bravo 22. Jun 2008 00:06

Re: Probleme mit Listbox Einträgen
 
ich merke gerade das ich nicht mehr weit komme ich bin zu müde. ich mach in ein paar stunden weiter, trotzdem danke. :zwinker:

DeddyH 22. Jun 2008 08:42

Re: Probleme mit Listbox Einträgen
 
Das Problem ist ganz einfach: Wenn Du in beiden Units jeweils eine Variable vom Typ TDeinArray definierst, sind das auch 2 verschiedene Variablen. Wenn mein Nachbar und ich das gleiche Auto haben, kann er seins so oft waschen, wie er will, davon wird meins nicht sauberer :zwinker:

Die Muhkuh 22. Jun 2008 08:50

Re: Probleme mit Listbox Einträgen
 
Leider, Detlef, leider :mrgreen:

Johnny Bravo 22. Jun 2008 11:47

Re: Probleme mit Listbox Einträgen
 
Ok, ich hab jetzt eine Unit names "FileArray" erstellt,in der sich MeinArray befinden soll, worauf die Units Main und Name zugreifen sollen.
Unit Name soll schließlich die Daten ins Array schicken.
in der FileArray befindet sich bis jetzt folgendes:
Hab in beiden Formularen Main und Name in der Uses Klausel FileArray eingetragen.[delphi]
[pre]unit FileArray;


interface
var
lIndex : Integer;

implementation
type
TFilenameInfos = record
RealFileName: String;
DisplayName: String;
private
MeinArray: Array of TFilenameInfos; // TFilenameInfos wurde nicht vollständig definiert, Fehlermeldung Nr.1, "Das Private Symbol "Mein Array wurde deklariert, aber nie verwendet"
end;
end.
[/pre]

[pre]
procedure TForm4.Button1Click(Sender: TObject);
var
IconIndex : Integer;
h : hIcon;
S : String;
Icon : TIcon;


begin


if (Edit1.Text = '') then
begin
ShowMessage('Bitte geben sie einen Namen ein.');
exit;
end
else

if Form2.ListBox1.ItemIndex >= 0 then
begin
MeinArray.lIndex := Length(MeinArray);
SetLength(FileArray.FileArray, lIndex + 1);
MeinArray[lIndex].RealFileName := Form2.OpenDialog1.FileName;
MeinArray.MeinArray[lIndex].DisplayName := Form4.Edit1.Text;
Form2.ListBox1.Items.Add(MeinArray[lIndex].DisplayName);
Form2.Listbox1.Update;
end;
[/pre]

wenn ich oben überall ein FileArray vor das MeinArray setzte, bekomme ich eine fehlermeldung "Nicht deklarierter bezeichner MeinArray und lIndex"
Aber lIndex ist doch als globale Variable in Unit FileArray gesetzt oder nicht?

DeddyH 22. Jun 2008 11:50

Re: Probleme mit Listbox Einträgen
 
Delphi-Quellcode:
unit FileArray;

interface

type
   TFilenameInfos = record
     RealFileName: String;
     DisplayName: String;
  end;
 
var
  lIndex : Integer;
  MeinArray: Array of TFilenameInfos;

implementation

end.
Die Typen und Variablen müssen schon im Interface-Teil stehen.

Johnny Bravo 22. Jun 2008 12:06

Re: Probleme mit Listbox Einträgen
 
Ok, hab ich so übernommen. jetzt gibts keine probleme mit nicht deklarierten bezeichnern.
Jetzt funktioniert das ganze auch ohne FileArray davor.

allerdings wird jetzt hier ein fehler ausgespuckt:
Delphi-Quellcode:
begin
         [lIndex] := Length(MeinArray); //Fehler: Der linken seite kann nichts zugewiesen werden.
         SetLength(MeinArray, lIndex + 1);
         MeinArray[lIndex].RealFileName := Form2.OpenDialog1.FileName;
         MeinArray[lIndex].DisplayName := Form4.Edit1.Text;
         Form2.ListBox1.Items.Add(MeinArray[lIndex].DisplayName);
         Form2.Listbox1.Update;
      end;

mkinzler 22. Jun 2008 12:08

Re: Probleme mit Listbox Einträgen
 
Delphi-Quellcode:
 lIndex := Length(MeinArray);
Aber du kannst auch gleich
Delphi-Quellcode:
SetLength(MeinArray, Length(MeinArray) + 1);

Johnny Bravo 22. Jun 2008 12:13

Re: Probleme mit Listbox Einträgen
 
ja, das mit den eckigen klammern hab ich auch gerade bemerkt, thx.
hab deinen code hinzugefügt und ersetzt, aber dann kommt wieder DeddyH´s Showmessage "Da haben wirs"
und direkt danach kommt wieder "Fehler bei der Bereichsprüfung" wieder an der selben stelle bei ShellExecute. :wall:

Delphi-Quellcode:
begin
  FileArray.lIndex := ListBox1.ItemIndex;
  if FileArray.lIndex < 0 then exit;
  if lIndex > High(MeinArray) then
    ShowMessage('Da haben wirs');

 Err := ShellExecute(Application.Handle, // hier tritt der fehler wieder auf.
      'open',
      Pchar(MeinArray[lIndex].RealFileName),
      NIL,
      NIL,
      SW_SHOWNORMAL);

  if Err < 33 then
    Showmessage(ShellExecuteErrMessage(Err));
    if CheckBox2.Checked then
     Application.Minimize;

end;

Die Muhkuh 22. Jun 2008 13:27

Re: Probleme mit Listbox Einträgen
 
Hast Du aus den jeweiligen Units (Name.pas und Main.pas) die Definitionen von MeinArray gelöscht?

Johnny Bravo 22. Jun 2008 14:17

Re: Probleme mit Listbox Einträgen
 
ja, ist alles entfernt. Die beiden greifen jetzt auf die Unit FileArray zu, wo MeinArray deklariert ist.

MSSSSM 22. Jun 2008 15:16

Re: Probleme mit Listbox Einträgen
 
Also ich finde, dass es mit Objects von TStrings einfacher geht.
Wenn ich die Erlaubnis dazu bekomme, hänge ich en Beispiel an.
mfg

[edit=Luckie]Beitrag sichtbar gemacht. Mfg, Luckie[/edit]

Johnny Bravo 22. Jun 2008 16:30

Re: Probleme mit Listbox Einträgen
 
Zitat:

Zitat von MSSSSM
Also ich finde, dass es mit Objects von TStrings einfacher geht.
Wenn ich die Erlaubnis dazu bekomme, hänge ich en Beispiel an. (*g*)

mfg

man kann deinen text nur lesen wenn man dich zitiert.
Von mir aus kannst du gerne ein beispiel machen, solange es funktioniert :D

MSSSSM 22. Jun 2008 17:08

Re: Probleme mit Listbox Einträgen
 
Liste der Anhänge anzeigen (Anzahl: 1)
im Anhang

Johnny Bravo 22. Jun 2008 18:21

Re: Probleme mit Listbox Einträgen
 
super, genau die funktionen, die ich benötige. ich werde mir mal den code anschauen und dann feedback geben.

DeddyH 22. Jun 2008 18:27

Re: Probleme mit Listbox Einträgen
 
Womit wir dann wieder bei #2 wären :wall: (wieso tu ich mir das eigentlich an?)

Johnny Bravo 22. Jun 2008 18:30

Re: Probleme mit Listbox Einträgen
 
keine angst, ich hab ne kopie von meinem projekt gemacht. ich will das ja nur testen.
Es ist ja nicht so, das alles unnütz war ;)

calculon 22. Jun 2008 18:44

Re: Probleme mit Listbox Einträgen
 
Bitte korrigiert mich, wenn ich falsch liege, aber

@MSSSSM: Der Witz bei der Sache ist doch, dass hier bei deinem Listbox1.Items.AddObject(DisplayName,TObject(Opend ialog1.Files[i]));
nur Zeiger mitabgelegt werden. Die strings werden aber nicht gespeichert, sondern nur Zeiger (auf den Zeiger) auf den string (welcher auch fast ein Zeiger ist)! [OT] Nice going, Borland [/OT]
Dann ist es doch nur noch reine Glückssache, ob bei deinem Ausführen-Button der Pointer noch auf die korrekte String-Adresse zeigt, oder diese bereits wieder überschrieben wurde. http://www.linuxhilfe.org/images/smi...n_roulette.gif Probier' mal dein Beispiel etwas aus, bei mir kommen immer wieder Zugriffsverletzungen...

Gruß
--

Johnny Bravo 23. Jun 2008 18:28

Re: Probleme mit Listbox Einträgen
 
@Calculon
bei funktionierts einwandfrei, ohne fehler, mit mehreren einträgen.
Ich habe die funktion von MSSSSM bei mir eingebaut und bin zufrieden damit mit. Hat alles sofort geklappt, ein danke an dich.
ein fettes danke natürlich ganz besonders an DeddyH, mkinzler und DieMuhkuh für eure tipps und geduld. :thumb:


EDIT:
Muss mich korrigieren, Calculon hat recht. Der String wird manchmal überschrieben manchmal nicht, also endet in einem "Datei nicht gefunden" Dialog. : :roll:

Larsi 23. Jun 2008 18:43

Re: Probleme mit Listbox Einträgen
 
Wie wärs denn mit einer Listview falls noch einer ne andere Lösung braucht?

calculon 23. Jun 2008 18:47

Re: Probleme mit Listbox Einträgen
 
Zitat:

Zitat von Johnny Bravo
EDIT:
Muss mich korrigieren, Calculon hat recht. Der String wird manchmal überschrieben manchmal nicht, also endet in einem "Datei nicht gefunden" Dialog. : :roll:

Ein funktionierendes Beispiel in dem die Strings in einem Record gespeichert werden, hab' ich auf der ersten Seite in diesem Thread gegeben. Du musst das nur auf dein spezielles Problem übertragen...

Gruß
--

Johnny Bravo 23. Jun 2008 18:56

Re: Probleme mit Listbox Einträgen
 
Ja, das hab ich mir noch mal durchgelesen. Aber da werden ja alle Dateien von einem Ordner eingescannt und gespeichert - eigentlich will ich nur eine auswählen.... :?:

MSSSSM 23. Jun 2008 20:07

Re: Probleme mit Listbox Einträgen
 
hm, vllt. solltest du doch ein array nehmen...

mfg

Johnny Bravo 23. Jun 2008 21:17

Re: Probleme mit Listbox Einträgen
 
hm..ich muss es nur irgendwie hinbekommen, anstatt das ein verzeichnis nach dateien durchsucht wird, der Open Dialog sich öffnet, und die Datei genauso in der Listbox speichert wie mit GetFilesInDirectory...kann mir da wer helfen?

Johnny Bravo 26. Jun 2008 21:01

Re: Probleme mit Listbox Einträgen
 
kann mir denn keiner helfen? :cry:

Johnny Bravo 1. Jul 2008 21:19

Re: Probleme mit Listbox Einträgen
 
Es ist unglaublich, aber ich hab es geschafft. Ich hab rumprobiert und bin zu folgendem ergebnis gekommen:
Hier die komplette prozedur:


Delphi-Quellcode:
procedure TForm2.Button3Click(Sender: TObject);
 var
   DisplayName:string;
    i:integer;
    h : hIcon;
    S : String;
    Icon : TIcon;
    lIndex: Integer;

begin
     openDialog := TOpenDialog.Create(self);                
     openDialog.InitialDir := GetCurrentDir;                
     openDialog.Options := [ofFileMustExist];                
     openDialog.Filter := 'Anwendungen|*.exe';          
     openDialog.FilterIndex := 0;

  if OpenDialog1.Execute then
  for i:=0 to OpenDialog1.Files.Count -1 do
    begin
    lIndex := Length(MeinArray);
    SetLength(MeinArray, lIndex + 1);
    MeinArray[lIndex].RealFileName := OpenDialog1.FileName;
    MeinArray[lIndex].DisplayName := DisplayName;
    ListBox1.Items.Add(MeinArray[lIndex].DisplayName);

   begin
      DisplayName := ExtractFileName(Opendialog1.Files[i]);
  if (InputQuery('Programmname','Bitte geben sie ein neuen Namen ein:',DisplayName)) AND (DisplayName <> '') then
     begin
         Listbox1.Items.AddObject(DisplayName,TObject(Opendialog1.Files[i]));
         SetLength(DisplayName,i +0); // Notwendig? Normal nicht..oder?
         SetLength(S, +0);            // siehe oben..
        begin
         ImageList1.GetIcon(0, Icon);
         Image1.Canvas.Draw(0, 0, Icon);
         Icon := TIcon.Create;
         Form2.ImageList1.AddIcon (Icon);
         S := OpenDialog1.FileName;
         h := IconFromFile(Form2.OpenDialog1.FileName,0);
         Label2.Caption := ListBox1.Items.Text;
         Label9.Caption := GetFileVersion(s);
        end;

      with
          Image1.Canvas Do
          DrawIconEx(Handle, 0, 0,h, 32, 32, 0, Brush.Handle, di_Normal);
      begin
          //ImageList1.Clear;
          Label3.Caption := s;
          FreeAndNil(Icon);
       end;
          Image1.Refresh;
     end;
    end;
  end;
end;
Mit nur dem Array oder den Strings hat es nicht funktioniert - so wie oben klappts hervorragend.


Ein "Problem" hab ich aber noch. Jedes mal wenn ich einen entrag hinzufüge, wird eine leere zeile mit an erster stelle in der listbox eingefügt - das ist nicht schön.
wie kann ich das ändern?

thx im vorraus :thumb:

DeddyH 2. Jul 2008 07:41

Re: Probleme mit Listbox Einträgen
 
Ich habe jetzt nicht versucht, die Logik zu durchschauen, aber mir sind 3 Dinge aufgefallen:

1. Wo ist denn opendialog definiert? Ist das eine globale Variable?
2. Du erzeugst opendialog und greifst später auf OpenDialog1 zu :gruebel:
3. Ein try-finally-Block wäre mehr als angebracht.
Delphi-Quellcode:
openDialog := TOpenDialog.Create(self);
try
  //Arbeiten mit dem Dialog
finally
  openDialog.Free;
end;
Und ob GetCurrentDir wirklich stimmt, musst Du selbst wissen. Evtl. meinst Du ja ExtractFilePath(ParamStr(0)).

Johnny Bravo 2. Jul 2008 18:33

Re: Probleme mit Listbox Einträgen
 
1.OpenDialog ist eine Globale variable gewesen, ich hatte noch ander funktionen die darauf zugreifen. hab aber jetzt jeder prozedur eine eigene variable gegeben.
2.Stimmt, OpenDialog und OpenDialog1 sind meine fehler gewesen, hab jetzt überall OpenDialog korrigiert.Dachte das stimmt so.
3.Danke, hab ich eingefügt.

hab den fehler gefunden das immer eine zusätzliche leere zeile einfügt wurde:
Delphi-Quellcode:
 ListBox1.Items.Add(MeinArray[lIndex].DisplayName);
ich hab das einfach rausgenommmen, so funktionierts ebenfalls problemlos.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr.
Seite 3 von 3     123   

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