2016-04-05 3 views
-1

Ich arbeite mit Delphi 10 Seattle DX Studio. Ich entwickle App, in der ich ListBox verwende. Ich möchte ausgewählte Elemente in meiner ListBox löschen, habe aber ein Problem mit diesem Code. Wenn ich diesen Code ausführe, erhalte ich den Fehler "Typ des Ausdrucks muss boolesch sein", obwohl mein Code die korrekte Syntax hat. Ihre Antworten werden geschätzt.Delphi Fehler ListBox

procedure TForm1.Button2Click(Sender: TObject); 
var 
    ii : integer; 
begin 
    with ListBox1 do 
    for ii := -1 + Items.Count downto 0 do 
     if Selected[ii] then Items.Delete(ii) ; 
end; 
end; 
+0

Auf welcher Leitung landet der Debugger? –

+1

Dieser Code funktioniert perfekt für mich: 'var i: Integer; Beginne für i: = ListBox1.Items.Count - 1 bis 0 tun, wenn ListBox1.Selected [i] dann ListBox1.Items.Delete (i); Ende; '. –

+0

Das Problem ist mit ** Ausgewählt [ii] ** – Dominikis

Antwort

3

Ihr Code (was ich vermute, unterscheidet sich von dem in der Frage) nicht die richtige Syntax, das ist, was der Compiler sagt Ihnen.

Die Tatsache, dass es wahrscheinlich aussieht, dass Ihr Code von dem Code in der Frage unterscheidet, und dass wir nicht sagen können, ob Sie VCL oder FMX verwenden, macht diese Frage etwas zweifelhaft. An einem anderen Tag würde ich wahrscheinlich als Off-Topic abstimmen, aber heute werde ich unabhängig davon weitermachen, was wahrscheinlich unklug ist. Hier geht.

Der Code in der Frage ist (fast) gültige VCL-Code. Es gibt ein extra end und ich kann nur vermuten, dass es sich um einen Übertragungsfehler handelt. Offensichtlich sieht dein tatsächlicher Code nicht so aus, weil du nicht so einrücken würdest.

Ihr Code ist kein gültiger FMX-Code, selbst nachdem der streunende end entfernt wurde. Die Compiler-Objekte Selected[ii] mit:

[DCC32 Fehler]: E2149-Klasse nicht über eine Standardeigenschaft

Das ist ein anderer Fehler von dem Sie gemeldet. Der Grund für den Fehler ist, dass Selected eine nicht indizierte Eigenschaft des Typs TListBoxItem ist.

Ich denke, was wirklich los ist, ist, dass der Code in der Frage unterscheidet sich von dem Code, den Sie versuchen zu kompilieren. Und der Code, den Sie versuchen zu kompilieren, ist nicht gültig. Wenn der Compiler Ihnen sagt, dass Ihr Code ungültig ist, sollten Sie es als Regel annehmen, auch wenn Sie ihn nicht sofort verstehen.

Ihr Leben wird viel einfacher, wenn Sie aufhören, with zu verwenden. Every time you use with, a puppy dies. Darüber hinaus wird Ihr Namespace mit oft überraschenden und unvorhersehbaren Ergebnissen erweitert, da Namen aus dem inneren Namensraum diejenigen aus dem äußeren Namensraum ausblenden.

Während es klar ist, dass -1 + Items.Count das gleiche wie Items.Count - 1 ist, müssen Sie weit und weit suchen, um einen Programmierer zu finden, der erstere schreiben würde. Du könntest es weiterhin tun, aber du wirst gegen die Flut schwimmen. Ihr Code wird sich von allen anderen Codes unterscheiden, und es wird eine große Impedanz für alle anderen Leser Ihres Codes geben. Ich schlage vor, dass Sie mit dem Fluss auf diesem gehen.

+1

Diese armen, armen Welpen: -/ –

+0

* Keine Welpen wurden beim Schreiben dieses Codes geschädigt *. :) Dies ist ein Beispiel, in dem * alles * innerhalb des * mit * eine direkte Referenz auf den inneren Bereich oder eine einfache Schleifenvariable ist. Probleme mit 'with' [sic] treten auf, wenn sowohl innere * als auch breitere Bereiche referenziert werden. Oder mit dem Debugger.Fazit: Die Verwendung von 'mit' war für das Problem in der Frage völlig irrelevant. Es zu erheben ist ein reines Dogma. Was nicht heißt, dass "mit" nicht potenziell schädlich ist. Es gibt sehr wenig, was ist. ;) – Deltics

+0

Übrigens verwende ich immer 'Pred()', nicht ''-1'. Es ist viel einfacher, ein fehlendes * Ende * -1 zu übersehen, wenn Code gelesen wird (eine Aktivität von links nach rechts). Ein ähnlicher Grund könnte diesen Ansatz "-1 +" inspirieren. Es platziert die 0-Basis-Anpassung vorne, prominenter, so dass es (vielleicht) wahrscheinlicher registriert wird, wenn es * nicht * da ist. Ich stimme zu, dass dies ungewöhnlich ist, aber das ist nicht unbedingt eine schlechte Sache. Immerhin ist "Going with the flow" das Grundprinzip, das zum "Cargo Cultism" führt. – Deltics