Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Komisches Verhalten beim Listbox durchsuchen (https://www.delphipraxis.net/116117-komisches-verhalten-beim-listbox-durchsuchen.html)

XXcD 23. Jun 2008 22:20


Komisches Verhalten beim Listbox durchsuchen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich schreibe gerade einen kleinen HTTPServer, dort möchte ich feststellen ob das Request Dokument in einer Listbox steht.

Hier mal der Code zum durchsuchen:
Delphi-Quellcode:
function inlist(list: TListbox; Request: string): Boolean;
var
  I: Integer;
begin
  I := List.Items.IndexOf(Request);
  if I >= 0
  then
  begin
  Result:=true;
  end
  else
  begin
  Result:=false;
  end;
end;
Und in CommandGet hab ich folgendes:
Delphi-Quellcode:
  if inlist(Form2.ListBox1, RequestedDocument)=true then
  begin
  Log(RequestedDocument);
  end
  else
  begin
  Log(RequestedDocument);
 RequestedDocument :='index.html';
  end;

Ich habe ein Bild angehängt da sieht man den Fehler der beim Schließen des programms auftritt.

XXcD 23. Jun 2008 23:22

Re: Komisches Verhalten beim Listbox durchsuchen
 
Ich habe den Fehler gefunden, ich muss alle Formulare einmal geöffnet haben um darauf zuzugreifen. Lässt sich soetwas auch beim Start der Anwendung einbauen?

Dani 24. Jun 2008 01:01

Re: Komisches Verhalten beim Listbox durchsuchen
 
Ja, das geht schon. Ein geeigneter Ansatz wäre, die Daten aus der Listbox zu befreien und in Containerklassen (z.B. TObjectList) zu verpacken. Du kannst die Daten dann in der Listbox anzeigen lassen, indem du sie einfach bei Bedarf aus der Containerklasse holst. Siehe Delphi-Referenz durchsuchenTCustomListBox.Style Eigenschaft

marabu 24. Jun 2008 05:59

Re: Komisches Verhalten beim Listbox durchsuchen
 
Moin,

nur am Rande:

Tauchen Objekte in der Signatur deiner Funktion auf, dann solltest du die Klasse mit der größtmöglichen Abstraktion verwenden. Da du in der Funktion InList() auf keine andere Eigenschaft der ListBox zugreifst, solltest du gleich die Items übergeben. Deren abstrakte Klasse ist TStrings, was zu einer Anpassung des Funktionsnamens führt. Wenn du dann noch deinen Code etwas vereinfachst, dann bleibt nicht mehr viel übrig.

Delphi-Quellcode:
function StrExists(items: TStrings; s: string): Boolean;
begin
  Result := items.IndexOf(s) >= 0;
end;
Wenn du die Funktion benutzt, dann gibt es zwei Gründe es anders zu tun als du es zeigst: Zum einen ist IF FALSE einfach eleganter als IF FALSE = TRUE, zum anderen gibt es mehrere Möglichkeiten einen Speicherbereich als boolesche Variable zu interpretieren, was gelegentlich zu Überraschungen führen kann. In deinem Fall besteht keine Gefahr, aber besser du gewöhnst es dir garnicht erst so an. Dass du deine Daten in einer ListBox anzeigst, ist sicherlich okay. Speichern solltest du sie aber in einer nicht-visuellen Klasse - aber das hat Dani dir schon geschrieben.

Delphi-Quellcode:
begin
  Log(RequestedDocument);
  if StrExists(DocumentList, RequestedDocument) then
    RequestedDocument := 'index.html';
end;
Grüße vom marabu

XXcD 25. Jun 2008 11:53

Re: Komisches Verhalten beim Listbox durchsuchen
 
Mein problem bleibt jetzt bei der Funktion Log.
Das ist ein eigenes Formular und da habe ich ein Memo drin.
So sieht die Funktion aus:
Delphi-Quellcode:
procedure Log(s: string);
begin
  try
Form6.Memo1.Lines.Add(DateTimeToStr(Now)+' | '+s);
  except
  end;
end;
Wenn ich das Formular nicht vor dem ersten Log Eintrag öffne gibt es beim Schließen des Programms immernoch den Fehler.
Ich dachte immer die Formulare werden beim starten des Programms alle geladen.
Wie kann ich denn jetzt den Fehler beheben?

DeddyH 25. Jun 2008 12:01

Re: Komisches Verhalten beim Listbox durchsuchen
 
Trenne Logik und Darstellung:
Delphi-Quellcode:
procedure Log(s: string, const sl: TStrings);
begin
  try
    sl.Add(DateTimeToStr(Now)+' | '+s);
  except
  end;
end;

procedure TForm6.Wuppdi;
begin
  Log('FooBar',Memo1.Lines);
end;

XXcD 25. Jun 2008 12:10

Re: Komisches Verhalten beim Listbox durchsuchen
 
Fehler bleibt der gleiche. Irgendwie muss das doch gehen :wall:

DeddyH 25. Jun 2008 12:19

Re: Komisches Verhalten beim Listbox durchsuchen
 
Wo rufst Du Log denn auf?

sakura 25. Jun 2008 12:27

Re: Komisches Verhalten beim Listbox durchsuchen
 
In den Projektoptionen [STG]+[F11] kannst Du die automatisch zu ladenen Formulare bestimmen. Aber wozu machst Du Dir diesen Umweg überhaupt. Würde in oben genannten Beispiel nicht eine einfach Stringliste reichen?

...:cat:...

SirThornberry 25. Jun 2008 13:09

Re: Komisches Verhalten beim Listbox durchsuchen
 
mit deiner Listbox wird das nie richtig funktionieren. Das OnCommandGet des TIdHTTPServer wird eigentlich in einem extra thread ausgeführt. Entsprechend sollte man von da aus nicht auf VCL-Elemente zugreifen.


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