![]() |
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:
Und in CommandGet hab ich folgendes:
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;
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. |
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?
|
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
![]() |
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:
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.
function StrExists(items: TStrings; s: string): Boolean;
begin Result := items.IndexOf(s) >= 0; end;
Delphi-Quellcode:
Grüße vom marabu
begin
Log(RequestedDocument); if StrExists(DocumentList, RequestedDocument) then RequestedDocument := 'index.html'; end; |
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:
Wenn ich das Formular nicht vor dem ersten Log Eintrag öffne gibt es beim Schließen des Programms immernoch den Fehler.
procedure Log(s: string);
begin try Form6.Memo1.Lines.Add(DateTimeToStr(Now)+' | '+s); except end; end; Ich dachte immer die Formulare werden beim starten des Programms alle geladen. Wie kann ich denn jetzt den Fehler beheben? |
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; |
Re: Komisches Verhalten beim Listbox durchsuchen
Fehler bleibt der gleiche. Irgendwie muss das doch gehen :wall:
|
Re: Komisches Verhalten beim Listbox durchsuchen
Wo rufst Du Log denn auf?
|
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:... |
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 12:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz