Delphi-PRAXiS

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 Element '' hat kein übergeordnetes Fenster (https://www.delphipraxis.net/81757-element-hat-kein-uebergeordnetes-fenster.html)

bensh 3. Dez 2006 11:57


Element '' hat kein übergeordnetes Fenster
 
Moin Leute.
Ich bin gerade dabei mir ein wenig Delphi beizubringen. Stolpere aber über einen relative kleinen Stein Namens InvalidOperation Exception mit der o.g. Meldung.

Mein Plan (Abstract):
Eine Textdatei auslesen und gültige Einträge in einer ListBox darstellen.

Mein Code:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, StrUtils, SysUtils, Variants, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls;

type

  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;


var
  Form1: TForm1;
  filename : String;
  entries : Array[Byte, 1..2] of String;

implementation

{$R *.dfm}


// Hilfsfunnktion
procedure Split (const Delimiter: Char;
                         Input: string;
                         const Strings: TStrings) ;
begin
   Assert(Assigned(Strings)) ;
   Strings.Clear;
   Strings.Delimiter := Delimiter;
   Strings.DelimitedText := Input;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  line : String;
  handle : TextFile;
  i : Integer;
  A : TStringList;
begin
  // assign components
  ListBox1 := TListBox.Create(self);

  filename := 'Road/to/File';
  AssignFile(handle, filename);
  Reset(handle);

  i := 0;

  while not Eof(handle) do
   begin

     ReadLn(handle, line);
     if (AnsiStartsStr('#', line) <> true)
     AND (Length(line) > 0) then
     begin
      // ab hier haben wir gueltige eintraege

      // temporaerer Container instanziieren
      A := TStringList.Create();
      try

        Split(' ', line, A);
        entries[i,1] := a[0];
        entries[i,2] := a[1];

        ListBox1.Items.Add(entries[i,2]);
        i:=i+1;

      finally
        // Container lösen
      A.Free;
      end; // try

    end; // if
  end; // loop

end; // procedure

end.
Die Meldung besagt ja dass das Befüllen der Listbox illegal ist.
Der Debugger sagt definitiv dass es hier passiert
Delphi-Quellcode:
ListBox1.Items.Add(entries[i,2]);
Seht ihr einen Fehler?!

Vielen Dank im Voraus!
Cheers!

[edit=SirThornberry]Titel des Beitrags geändert - Mfg, SirThornberry[/edit]

xaromz 3. Dez 2006 12:25

Re: Element '' hat kein übergeordnetes Fenster (Newbie)
 
Hallo,

gehe ich Recht in der Annahme, dass die Listbox schon im Designer erstellt wird? Dann darfst Du diese nicht nochmals erstellen, das erledigt die VCL für Dich.
Wenn nicht, dann musst Du Deiner Listbox noch ein Parent übergeben, in dem sie angezeigt werden soll. In Deinem Fall das Fenster selbst:
Delphi-Quellcode:
Listbox1.Parent := Self;
Übrigens läuft Dir nach 256 Einträgen Dein Array über. Du kannst auch einfach eine StringList nehmen, die kann mit Schlüssel-/Wertepaaren umgehen. Dann kannst Du einfach die ganze Datei einlesen und die Kommentarzeilen rausschmeißen. Ich hänge mal ein kommentiertes Beispiel an:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    // StringListe Methode definieren
    Values: TStringList;
    procedure LoadFile(const Name: String);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  // StringListe anlegen und vorbereiten
  Values := TStringList.Create;
  Values.NameValueSeparator := ' ';

  // Datei laden
  LoadFile('C:\Test.txt');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // Stringliste zerstören
  Values.Free;
end;

procedure TForm1.LoadFile(const Name: String);
var
  C: Integer;
begin
  // Datei laden
  Values.LoadFromFile(Name);

  // Kommentare und leere Zeilen ausfiltern
  for C := Values.Count - 1 downto 0 do
    if (Values[C] = '') or (Pos('#', Trim(Values[C])) = 1) then
      Values.Delete(C);

  // Listbox füllen
  ListBox1.Items.BeginUpdate;
  try
    ListBox1.Items.Clear;
    for C := 0 to Values.Count - 1 do
      ListBox1.Items.Add(Values.ValueFromIndex[C]);
  finally
    ListBox1.Items.EndUpdate;
  end;
end;
Gruß
xaromz

bensh 3. Dez 2006 13:18

Re: Element '' hat kein übergeordnetes Fenster (Newbie)
 
Super!
Klappt! Danke! ;)

Delphi-Quellcode:
ListBox1 := TListBox.Create(Self);
habe ich entfernt und es läuft alles super... noch...

wär super wenn du den thread im augen behältst, falls da noch Fragen auftreten. Was schon fast garantiert ist. Ich komme aus der Java Ecke und habe noch nie mit mit Pascal/Delphi zu tun gehabt.. ist mal ein ganz anderes Konzept ;)

Danke nochmal

bensh 3. Dez 2006 13:21

Re: Element '' hat kein übergeordnetes Fenster (Newbie)
 
Wie läft das eigentlich mit dem VCL?
Warum musste ich die Zuweisung herausnehmen? Ist da so eine Art Descriptor der die Formular-Komponenten schon bei (visueller) Erstellung registriert? oder wie?

SirThornberry 3. Dez 2006 13:22

Re: Element '' hat kein übergeordnetes Fenster
 
Bei uns gilt pro Frage ein neuer Thread. Wenn du also eine weitere Frage hat die nix mit dem Titel zu tun hat eröffne einfach einen neuen Thread mit dem neuen Problem. :-)

Um zu vermeiden das die neue Frage, welche nix mehr mit dem ursprünglichen Titel zu tun hat, behandelt wird mach ich hier mal zu.
*** LOCKED ***


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 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