Delphi-PRAXiS
Seite 3 von 12     123 45     Letzte »    

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)

DeddyH 20. Jun 2008 19:15

Re: Probleme mit Listbox Einträgen
 
Moment, die Items sind doch schon in der Listbox enthalten, oder? Dann ist die ganze Passage
Zitat:

Delphi-Quellcode:
  if OpenDialog1.Execute() then // wenn ich hier die 1 entferne, und oben ebenfalls, gibts wieder einen Laufzeitfehler.
  begin
    lIndex := Length(MeinArray);
    Form4.Show; // Das ist das 2te Formular, in der man den ALternativnamen eingibt.
    SetLength(MeinArray, lIndex + 1);
    MeinArray[lIndex].RealFileName := OpenDialog1.FileName;
    MeinArray[lIndex].DisplayName := Form4.Edit1.Text;
    ListBox1.Items.Add(MeinArray[lIndex].DisplayName);
  end;

doch Grütze, da Du hier wieder den OpenDialog aufrufst und das Item hinzufügst. Außerdem fehlt hiervor irgendwie ein Aufruf von ShellExecute.
Zitat:

Delphi-Quellcode:
  if Err <= 32 then
      Showmessage(ShellExecuteErrMessage(Err));

Err ist gar nicht initialisiert, was soll denn da kommen? Das soll doch den Rückgabewert von ShellExecute aufnehmen, oder täusche ich mich?

Johnny Bravo 20. Jun 2008 20:31

Re: Probleme mit Listbox Einträgen
 
Hi,
hab die fehler beseitigt und den richtigen code hier:
Irgendwie komm ich heute auf keinen grünen zweig. Lauter Fehler die man eigentlich sofort sehen sollte.. :roll:


das ist der befehl, die Datei aus dem array zu starten - es passiert jedoch nichts, keine fehlermeldung, rein gar nichts.
Delphi-Quellcode:
begin
  if Err = 0  then
      ShellExecute (Form2.Handle,
      'open',
      Pchar('MeinArray[lIndex].RealFileName'),
      NIL,
      NIL,
      SW_SHOWNORMAL);

das ist die prozedur die datei aus dem Opendialog in die Listbox zu laden:(überarbeitet)

Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
    var IconIndex : Integer;
    h : hIcon;
    S : String;
    Icon : TIcon;
    Bitmap : TBitmap;
    OpenDialog : TOpenDialog;
    lIndex: Integer;


    begin
         lIndex := Length(MeinArray);
         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.MultiSelect :=False;
         Form2.ListBox1.Sorted :=True;
         Form2.Label2.Caption := OpenDialog.FileName;
         Icon := TIcon.Create;
         IconIndex := 0;
         S := OpenDialog.FileName;
         h := IconFromFile(OpenDialog.FileName,0);
         Form2.ImageList1.AddIcon (Icon);

       try
          Form2.ImageList1.GetIcon(0, Icon);
          Form2.Image1.Canvas.Draw(0, 0, Icon);

      with
          Form2.Image1.Canvas Do
          DrawIconEx(Handle, 0, 0,h, 32, 32, 0, Brush.Handle, di_Normal);

      begin
          Form4.Close;
          Edit1.Clear;

          end;

        finally
          FreeAndNil(Icon);
     end;
   end;
wie gesagt,sobald ein eintrag in der Listbox drin ist, und gestartet werden soll, passiert nichts, aber auch rein gar nichts.

EDIT: Habs schon mit Application.Handle und SW_NORMAL versucht, ohne erfolg.

Fussball-Robby 20. Jun 2008 20:35

Re: Probleme mit Listbox Einträgen
 
Schonmal den Rückgabewert von ShellExecute anzeigen lassen?

DeddyH 20. Jun 2008 20:39

Re: Probleme mit Listbox Einträgen
 
Wie wäre es denn so?
Delphi-Quellcode:
Err := ShellExecute(Form2.Handle,
      'open',
      Pchar('MeinArray[lIndex].RealFileName'),
      NIL,
      NIL,
      SW_SHOWNORMAL);
  if Err < 33 then
    Showmessage(ShellExecuteErrMessage(Err));
[edit] :wall: Nimm mal die Hochkommata im 3. Parameter raus:
Delphi-Quellcode:
Pchar('MeinArray[lIndex].RealFileName')
--> Pchar(MeinArray[lIndex].RealFileName)
[/edit]

Johnny Bravo 20. Jun 2008 21:16

Re: Probleme mit Listbox Einträgen
 
Zitat:

Zitat von DeddyH
Wie wäre es denn so?
Delphi-Quellcode:
Err := ShellExecute(Form2.Handle,
      'open',
      Pchar('MeinArray[lIndex].RealFileName'),
      NIL,
      NIL,
      SW_SHOWNORMAL);
  if Err < 33 then
    Showmessage(ShellExecuteErrMessage(Err));

damit bekomme ich ERangeError "Fehler bei der Bereichsprüfung".
Der fehler wird bei
Delphi-Quellcode:
Err := ShellExecute(Form2.Handle,
angezeigt.

Fussball-Robby 20. Jun 2008 21:19

Re: Probleme mit Listbox Einträgen
 
Siehe Deddys Edit. Hätte ich auch drauf kommen können :wall:

Johnny Bravo 21. Jun 2008 11:10

Re: Probleme mit Listbox Einträgen
 
Hab ich ganz vergessen zu erwähnen, das hab ich schon ausprobiert. Es passiert nichts. :|

EDIT:

wenn ich shellexecute so umschreibe, bekomme ich wieder "Fehler bei der Bereichsprüfung":

Delphi-Quellcode:
begin
 Err:= ShellExecute (0,
               NIL,
               NIL,
               'open',
               PChar(MeinArray[lIndex].RealFileName),
               SW_SHOWNORMAL);
mach ich es jedoch mit Hochkomma, wird der aktuelle Projektordner im Explorer geöffnet, schonmal etwas....aber wieso gerade der Projektordner?

ich verstehe nicht woran es liegen könnte.....

DeddyH 21. Jun 2008 11:38

Re: Probleme mit Listbox Einträgen
 
Dann lass Dir MeinArray[lIndex].RealFileName doch mal mit ShowMessage ausgeben, irgendwas in Richtung falscher Eintrag wird es ja vermutlich sein.

Johnny Bravo 21. Jun 2008 18:39

Re: Probleme mit Listbox Einträgen
 
also, wenn ich ShellExecute so aufrufe, mit einem Absoluten Pfad, funktionert es.

Delphi-Quellcode:
 if Err = 0  then
      ShellExecute (Form2.Handle,
      'open',
      Pchar('C:\Windows\Notepad.exe'), //zB.
      Nil,
      Nil,
      SW_NORMAL);

Hat das vielleicht damit zutun, das ich 2 Formulare nutze, und in beiden sind die variablen für das Array definiert? Weil ich muss ja die daten aus dem 2ten Formular (Edit) ins 1te Formular einfügen (Listbox)

In beiden Formularen sind die Typen deklariert:
Delphi-Quellcode:
type
    TFilenameInfos = record
    RealFileName: String;
    DisplayName: String;
    end;
in Form2 siehts so aus, um den Namen aus dem Editfeld in die Listbox in Formular 1 einzufügen:

Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
    var
    IconIndex : Integer;
    h : hIcon;
    S : String;
    Icon : TIcon;
    Bitmap : TBitmap;
    OpenDialog : TOpenDialog;
    lIndex: Integer;

    begin

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

     else
         Form2.ImageList1.GetIcon(0, Icon);
         Form2.Image1.Canvas.Draw(0, 0, Icon);
         lIndex := Length(MeinArray);
         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.MultiSelect :=False;
         Form2.ListBox1.Sorted :=True;
         Form2.Label2.Caption := Form4.Edit1.Text;
         Icon := TIcon.Create;
         IconIndex := 0;
         S := OpenDialog.FileName;
         h := IconFromFile(OpenDialog.FileName,0);
         Form2.ImageList1.AddIcon (Icon);

      with
          Form2.Image1.Canvas Do
          DrawIconEx(Handle, 0, 0,h, 32, 32, 0, Brush.Handle, di_Normal);
      begin
          Form4.Close;
          Edit1.Clear;
          FreeAndNil(Icon);
          end;
     end;
das ist dann der ablauf von Shellexecute, um einen Eintrag der Listbox in Formular 1 zu starten:
Delphi-Quellcode:
procedure TForm2.Button2Click(Sender: TObject);
function ShellExecuteErrMessage(int_Code: INTEGER): String;

begin
  case int_code of
     0: result := 'Zuwenig Speicher, ausführbare Datei war zerstört, Relokationswerte waren ungültig';
     2: result := 'Datei wurde nicht gefunden.';
     3: result := 'Verzeichnis wurde nicht gefunden.';
     5: result := 'Fehler beim gemeinsamen Zugriff auf eine Datei im Netz oder Fehler beim Zugriff auf eine gesperrte Datei im Netz.';
     6: result := 'Bibliothek forderte separate Datensegmente für jede Task an.';
     8: result := 'Zuwenig Speicher, um die Anwendung zu starten.';
    10: result := 'Falsche Windows-Version.';
    11: result := 'Ungültige ausführbare Datei. Entweder keine Windows-Anwendung oder Fehler in der EXE-Datei.';
    12: result := 'Anwendung für ein anderes Betriebssystem.';
    13: result := 'Anwendung für MS-DOS 4.0.';
    14: result := 'Typ der ausführbaren Datei unbekannt.';
    15: result := 'Versuch, eine Real-Mode-Anwendung (für eine frühere Windows-Version) zu laden.';
    16: result := 'Versuch, eine zweite Instanz einer ausführbaren Datei mit mehreren Datensegmenten die nicht als nur lesbar gekennzeichnet waren, zu laden.';
    19: result := 'Versuch, eine komprimierte ausführbare Datei zu laden.' + #13 + 'Die Datei muß dekomprimiert werden, bevor sie geladen werden kann.';
    20: result := 'Ungültige dynamische Linkbibliothek (DLL).' + #13 + 'Eine der DLLs, die benötigt wurde, um die Anwendung auszuführen, war beschädigt.';
  else
    result := 'Ein Unbekannter Fehler ist aufgetreten. (' + IntToStr(int_code) + ')';
  end;
end;

begin
     
  if Err = 0  then
      ShellExecute (Form2.Handle,
      'open',
      Pchar('MeinArray[lIndex].RealFileName'), // absoluter Pfad funktioniert, nur ein Eintrag aus dem Array nicht....
      Nil,
      Nil,
      SW_NORMAL);

  if Err <= 32 then
      Showmessage(ShellExecuteErrMessage(Err));
end;


Aber wieso wird nicht
Delphi-Quellcode:
MeinArray[lIndex].RealFileName
geladen wenn ich das da einfüge?
Ich weiß nicht wo ich nach dem fehler suchen soll.... :pale:

DeddyH 21. Jun 2008 18:42

Re: Probleme mit Listbox Einträgen
 
Hast Du denn mal gemacht, was ich Dir geraten habe?
Delphi-Quellcode:
Pchar('MeinArray[lIndex].RealFileName')
ist Quatsch, die Hochkommata müssen da raus. Und lass Dir mal den Eintrag ausgeben (ShowMessage), dann siehst Du sofort, ob das passt. 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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:30 Uhr.
Seite 3 von 12     123 45     Letzte »    

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