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:
Das Problem ist hier einfach, dass lIndex nichts zugewiesen wurde. Dem musst Du etwas zuweisen. Höchstwahrscheinlich den ItemIndex der ListBox1.
procedure TForm2.Button2Click(Sender: TObject);
var lIndex: Integer; begin Err := ShellExecute(Form2.Handle, 'open', Pchar(MeinArray[lIndex].RealFileName), NIL, NIL, SW_SHOWNORMAL); end; [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: |
Re: Probleme mit Listbox Einträgen
*Aaaaaarrrrgghh*
Zitat:
|
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. |
Re: Probleme mit Listbox Einträgen
Zitat:
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
|
Re: Probleme mit Listbox Einträgen
Ich brauch jetzt ne Pennpause. Cobra (Manuel), übernehmen Sie :lol:
|
Re: Probleme mit Listbox Einträgen
Bin schon fleißig dabei, Chef :mrgreen:
|
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:
|
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:
|
Re: Probleme mit Listbox Einträgen
Leider, Detlef, leider :mrgreen:
|
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? |
Re: Probleme mit Listbox Einträgen
Delphi-Quellcode:
Die Typen und Variablen müssen schon im Interface-Teil stehen.
unit FileArray;
interface type TFilenameInfos = record RealFileName: String; DisplayName: String; end; var lIndex : Integer; MeinArray: Array of TFilenameInfos; implementation end. |
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; |
Re: Probleme mit Listbox Einträgen
Delphi-Quellcode:
Aber du kannst auch gleich
lIndex := Length(MeinArray);
Delphi-Quellcode:
SetLength(MeinArray, Length(MeinArray) + 1);
|
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; |
Re: Probleme mit Listbox Einträgen
Hast Du aus den jeweiligen Units (Name.pas und Main.pas) die Definitionen von MeinArray gelöscht?
|
Re: Probleme mit Listbox Einträgen
ja, ist alles entfernt. Die beiden greifen jetzt auf die Unit FileArray zu, wo MeinArray deklariert ist.
|
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] |
Re: Probleme mit Listbox Einträgen
Zitat:
Von mir aus kannst du gerne ein beispiel machen, solange es funktioniert :D |
Re: Probleme mit Listbox Einträgen
Liste der Anhänge anzeigen (Anzahl: 1)
im Anhang
|
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.
|
Re: Probleme mit Listbox Einträgen
Womit wir dann wieder bei #2 wären :wall: (wieso tu ich mir das eigentlich an?)
|
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 ;) |
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ß -- |
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: |
Re: Probleme mit Listbox Einträgen
Wie wärs denn mit einer Listview falls noch einer ne andere Lösung braucht?
|
Re: Probleme mit Listbox Einträgen
Zitat:
Gruß -- |
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.... :?:
|
Re: Probleme mit Listbox Einträgen
hm, vllt. solltest du doch ein array nehmen...
mfg |
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?
|
Re: Probleme mit Listbox Einträgen
kann mir denn keiner helfen? :cry:
|
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:
Mit nur dem Array oder den Strings hat es nicht funktioniert - so wie oben klappts hervorragend.
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; 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: |
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:
Und ob GetCurrentDir wirklich stimmt, musst Du selbst wissen. Evtl. meinst Du ja ExtractFilePath(ParamStr(0)).
openDialog := TOpenDialog.Create(self);
try //Arbeiten mit dem Dialog finally openDialog.Free; end; |
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:
ich hab das einfach rausgenommmen, so funktionierts ebenfalls problemlos.
ListBox1.Items.Add(MeinArray[lIndex].DisplayName);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 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