Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Sortierte TObjectList - Einträge richtig einfügen (https://www.delphipraxis.net/185916-sortierte-tobjectlist-eintraege-richtig-einfuegen.html)

Benmik 17. Jul 2015 18:18

AW: Sortierte TObjectList - Einträge richtig einfügen
 
Beeindruckend, aber vielleicht ein bisschen l'art pour l'art? Es gibt auch auch die Frage, warum der Rüde sich die Eier leckt, aber die wollen wir jetzt nicht weiter vertiefen.

Wenn mich nicht alles täuscht, dann ist das letzte Vexierspielchen ja auch keine binäre Suche mehr, sondern eine einfache Interation?

Da der Abend hereinbricht, komme ich jetzt zu dem Schluss, dass mir die Lösungen aus #13 und #16 am einfachsten erscheinen, die #13 ist kürzer, die #16 wohl sauberer. Für mich wird es wohl (aber man weiß, Sir Rufos Trickkiste ist noch lange nicht leer) eine modifizierte Form werden:
Delphi-Quellcode:
function TZielListe.SucheWert(const Wert:string;var P:Integer):Boolean;
var LItem:TZiel;
begin
  LItem := TZiel.Create;
  try
    LItem.Wert := Wert;
    Result := BinarySearch(
      LItem, p,
      TComparer<TZiel>.Construct(
        function (const L, R: TZiel): Integer
        begin
          Result := AnsiCompareText(L.Wert,R.Wert);
        end ));
  finally
    LItem.Free;
  end;
end;
So bekomme ich mit p auch das gefundene Element oder im Negativfalle die Einfügeposition zurück.
Eigentlich spricht auch nichts gegen die Dummy-Lösung, man spart sich das Create und Free und initialisert wegen des Compiler-Gemeckers einfach mit nil.

Stevie 17. Jul 2015 18:33

AW: Sortierte TObjectList - Einträge richtig einfügen
 
In Delphi 2009 lösen diese Generics Pheromone bei mir aber eher einen sehr starken Fluchtinstinkt aus :)

Benmik 17. Jul 2015 18:54

AW: Sortierte TObjectList - Einträge richtig einfügen
 
Dagegen würden Kritiker einwenden, dass du weder das Konzept von Pheromonen noch das von Generics verstanden hast. Bei beiden wird bei entsprechend veranlagten Individuen von einer extremen Anziehung ausgegangen. Der Aaskäfer dreht durch, wenn eine Aaskäferin ihre Moleküle verstreut, insbesondere, wenn sie gerade von einer gut durchmadeten Leiche kommt. Und der Delphianer ab D2009 ... Aber genug. Pheromone haben ihre Zielgruppe, und zu der muss man halt gehören. :wink:

Stevie 17. Jul 2015 18:57

AW: Sortierte TObjectList - Einträge richtig einfügen
 
Zitat:

Zitat von Benmik (Beitrag 1309083)
Dagegen würden Kritiker einwenden, dass du weder das Konzept von Pheromonen noch das von Generics verstanden hast. Bei beiden wird bei entsprechend veranlagten Individuen von einer extremen Anziehung ausgegangen. Der Aaskäfer dreht durch, wenn eine Aaskäferin ihre Moleküle verstreut, insbesondere, wenn sie gerade von einer gut durchmadeten Leiche kommt. Und der Delphianer ab D2009 ... Aber genug. Pheromone haben ihre Zielgruppe, und zu der muss man halt gehören. :wink:

Eventuell sollten diese Kritiker nochmal die Definition von Pheromonen nachlesen - Anziehung ist nur eine Reaktion die sie auslösen können. 8-)
Und das Konzept von Generics hab ich wohl ganz gut verstanden - es geht darum, dass sie in Delphi 2009 einfach grottenhaft verbuggt sind.
Wir reden nochmal, wenn den Kritikern der Compiler das erste mal mit ner AV weggesegelt ist :)

Benmik 17. Jul 2015 19:42

AW: Sortierte TObjectList - Einträge richtig einfügen
 
Oh je, es handelt sich also um Alarmpheromone.

Ich hab mich jetzt zu Folgendem entschlossen:
Delphi-Quellcode:
function TZielListe.FindeWert(const Wert:string;var P:Integer):Boolean;
var L:TZiel;
begin
  L     := TZiel.Create;
  L.Wert := Wert;
  p     := -1;
  try
    Result := BinarySearch(L, p, TComparer<TZiel>.Construct(
      function (const L, R: TZiel): Integer
      begin
        Result := AnsiCompareText(L.Wert,R.Wert);
      end));
  Finally
    L.Free;
  end;
end;

function TZielListe.AddSorted(const Ziel: TZiel): Boolean;
var P: Integer;
begin
  Result := Assigned(Ziel) and (Ziel.Wert <> '');
  If Result then
    begin
    FindeWert(Ziel.Wert,p);
    Result := (p > -1);
    If Result then
      Self.Insert(p,Ziel);
    end;
end;
Jetzt hoffe ich mal, von den AV verschont zu bleiben.

freimatz 23. Jul 2015 13:12

AW: Sortierte TObjectList - Einträge richtig einfügen
 
Zitat:

Zitat von Stevie (Beitrag 1309081)
In Delphi 2009 lösen diese Generics Pheromone bei mir aber eher einen sehr starken Fluchtinstinkt aus :)

Also bei mir löst Delphi 2009 Fluchtinstinkt aus. Wie kann man nur freiwillig mit so einem "Schrott" arbeiten? Ich mit XE-7 habe in der Regel keine Probleme. (Außer wenn ich siebenfach verschachtele Genercis verwenden will)

Benmik 31. Jul 2015 14:06

AW: Sortierte TObjectList - Einträge richtig einfügen
 
Wenn du mittlerweile mit XE7 arbeitest, solltest du deine Signatur aktualisieren. Die Bezeichnung "Schrott" für Delphi 2009 finde ich ärgerlich und sehr unangemessen. Und "freiwillig" ist bei Hobbyprogrammierern immer recht relativ.

Perlsau 21. Sep 2015 11:08

AW: Sortierte TObjectList - Einträge richtig einfügen
 
Moin allerseits, habe den Quellcode aus #9 in meinen zu integrieren versucht. Bei mir sieht das dann so aus:
Delphi-Quellcode:
UNIT ServerLogFiles;

INTERFACE

USES
  Windows, Classes, Messages, SysUtils, StrUtils, Generics.Collections, Generics.Defaults, Variants,
  LogFiles; // Klasse TLogFiles

TYPE
  TFileListe = CLASS(Generics.Collections.TObjectList<TLogFiles>)
    PRIVATE
      Function Compare(Item1, Item2 : TLogFiles): Integer;
    PUBLIC
      Constructor Create(OwnsObjects : Boolean = true);
  END;

TYPE
  TServerLogFiles = CLASS

  PRIVATE { Private-Deklarationen }

      FileList : TFileListe;
      ...
  END;

IMPLEMENTATION

{ TFileListe }

Function TFileListe.Compare(Item1, Item2 : TLogFiles): Integer;
begin
  Result := TComparer<String>.Default.Compare(Item1.FileName, Item2.FileName);
end;

Constructor TFileListe.Create(OwnsObjects: Boolean);
begin
 inherited Create(TComparer<TLogFiles>.Construct(Compare), OwnsObjects); // Fehler
end;

{ TSERVERLOGFILES }

...

end.
Beim Compilieren erhalte ich im Constuctor von TFileListe diesen Fehler bei (Compare):
ServerLogFiles.pas(96): E2010 Inkompatible Typen: 'TComparison<LogFiles.TLogFiles>' und 'Procedure of object'

Was mache ich da falsch?

Sir Rufo 21. Sep 2015 11:26

AW: Sortierte TObjectList - Einträge richtig einfügen
 
Du hast das
Delphi-Quellcode:
const
vor
Delphi-Quellcode:
Item1, Item2
vergessen ;)

Perlsau 21. Sep 2015 11:30

AW: Sortierte TObjectList - Einträge richtig einfügen
 
Ach du große Schande ... hab ich's doch gleich geahnt, daß es mal wieder ein Flüchtigkeitsfehler sein muß :oops:

Danke für deine schnelle Hilfe :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:31 Uhr.
Seite 3 von 5     123 45      

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