Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TClientDataSet/midas.dll und RegistryEinträge (https://www.delphipraxis.net/51506-tclientdataset-midas-dll-und-registryeintraege.html)

Thanatos81 13. Aug 2005 20:55

Datenbank: keine • Zugriff über: TClientDataSet

TClientDataSet/midas.dll und RegistryEinträge
 
Ich hab für meinen Vater ne kleine Anwendung unter D7 geschrieben, mit der Textdateien eingelesen und verarbeitet werden.

Es wird nix weggespeichert. Deswegen hab ich mich zwecks einfacher Handhabung für das TClientDataSet entschieden um die Daten einfach im Speicher zu halten/zu bearbeiten und die Datensätze nach drei Eigenschaften gleichzeitig zu sortieren. Dies brauche ich unbedingt für die Auswetung.

Da das Programm nur aus 4 Dateien besteht (Echse, midas.dll und 2 INI-Dateien) und nur von 3/4-versierten :stupid: Anwender genutzt wird, gibts keinen Installer. Die DLL liegt mit im Programmverzeichniss, damit das %windir%\system32-Verzeichnis nicht noch mehr zugemüllt wird.

Nun hatte mein Vater das Programmverzeichnis geändert (von nem Test-Verzeichnis in das endgültige). Danach lief das Programm auf einmal nicht mehr, da es die midas.dll nicht mehr finden konnte. Also hab ich erstmal wie blöd gerätselt, und dann die Registry nach der midas durchsucht. Ich wurde auch fündig und was war? Es gab mehrere Einträge, in dem der alte Pfad angegeben war. Nach dem Löschen all dieser Einträge aus der Registry lief wieder alles perfekt.

Meine Frage it jetzt, ob man das anlegen der Registry-Werte unterbinden kann, oder ob jemand ne Methode kennt, wie man ein array of Record nach drei Eigenschaften sortieren kann. [Zuerst nach KartenNr, innerhalb der KartenNr dann nach Datum, und innerhalb der von KartenNr/Datum nach Uhrzeit. (KartenNr = string, Datum = TDate, Uhrzeit = TTime)].

Schönen Dank im Voraus,

alzaimar 14. Aug 2005 11:41

Re: TClientDataSet/midas.dll und RegistryEinträge
 
1. Nimm ADO und einen Textdatei-Treiber ODER
2. Sortiere dein array of record mit einer TStringList. Die String-Einträge setzen sich aus den Sortierkriterium zusammen.
Delphi-Quellcode:
Procedure ArraySort (Var aList : TRecordArray);
Var
  sl : TStringList;
  i : Integer;

  Function _MakeKey (Const aRec : TUserRecord) : String;
// Liefert einen String, der als Sortierkriterium dient. Hier wird nach Kartennummer (max 20 Stellig),
// innerhalb gleicher Kartennr. nach Datum (10 stellig) und innerhalb gleichen Datums nach der Uhrzeit sortiert
// Das Verfahren lässt leicht sich auf andere Sortierkriterien anpassen.
  Begin
    Result := Format ('%-20s%-10s%-10s',[KartenNr, DateToStr (Datum), TimeToStr (Uhrzeit)]);
  End;

Begin
  sl := TStringlist.Create;
  Try
// Erst in die Stringliste schreiben...
    For i:=0 to Length (aList) - 1 do
      sl.addObject (_MakeKey (aList[i]), @aList[i]);
// ... dann sortieren ...
    sl.Sort;
// ... und nun sortiert wieder zurückschreiben
    For i:=0 To sl.Count - 1 do
      aList[i] := PUserRecord (sl.Objects[i])^
  Finally
    sl.free
    end
End;
Achtung! Ungetestet und aus der hohlen Hand gesch....

Thanatos81 14. Aug 2005 15:31

Re: TClientDataSet/midas.dll und RegistryEinträge
 
Danke! Dass erte hatte ich mir ausch schon überlegt, aber die zweite Methode sagt mir mehr zu. Ich arbeite wohl einfach zu gerne mit Records :-D Werde das ganze mal testen, sobaldsich der Restalkohol verflüchtigt hat :wink: Werde mich dann wieder melden, und falls bei deinem Coe was nicht stimmen sollte, eine geänderte Prozedur posten.

Aber soweit ich ds jetzt beurteilen kann, sieht das sehr gut aus :thumb:

MaBuSE 15. Aug 2005 06:23

Re: TClientDataSet/midas.dll und RegistryEinträge
 
Zitat:

Zitat von Thanatos81
...Danach lief das Programm auf einmal nicht mehr, da es die midas.dll nicht mehr finden konnte...

Hallo,
ergänze einfach die uses Anweisung im *.dpr um die Zeile "MidasLib,". Damit wird die Funktionalität der midas.dll in die *.exe eingebunden, und die midas.dll wird nicht mehr benötigt.
Das Programm (*.exe) wird damit zwar 200kb größer, aber das ist in den meisten Fällen egal. (dafür braucht man ja nicht mehr die midas.dll)

ich hatte mal folgendes geschrieben:
Es ist möglich den in der midas.dll ausgelagerten Code in das Projekt einzubinden.

Dazu muss nur in dem Projekt die *.dpr um eine Zeile ergänzt werden:
Delphi-Quellcode:
uses
  MidasLib, // damit wird die midas.dll nicht mehr benötigt
  Forms,
...
Das Einbinden der Midas in das Projekt hat folgende Vorteile:
  • Es wird keine midas.dll mehr benötigt
  • Die midas.dll muss demnach auch nicht mehr registriert sein
  • Es wird immer die Version verwendet, mit der auch das Programm erstellt wurde
  • Es ist also nicht mehr möglich, das eine Delphi 5 midas.dll mit einem Delphi 7 Programm verwendet wird
  • Es ist nur ein minimaler Aufwand Midas einzubinden (eine Zeile Quelltext / Projekt)
Das Einbinden der Midas in das Projekt hat im Wesentlichen 2 Nachteile:
  • Die Exe Datei wird ca. 200k größer
  • Wenn z.B. zwei Projekte Midas benutzen, wird nicht nur eine midas.dll geladen, sondern jedes Projekt lädt den Code jetzt in den Speicher.
Das Ganze ist noch mal (auf Englisch) nachzulesen unter: http://bdn.borland.com/article/0,1410,29297,00.html



Noch ein Beisp.
Delphi-Quellcode:
program Project1;

uses
  Forms,
  MidasLib, // <-- diese Zeile einfügen !!!
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Thanatos81 15. Aug 2005 07:12

Re: TClientDataSet/midas.dll und RegistryEinträge
 
Danke für den Hinweis!

Hab es gestern abend aber so ähnlich gelöst wie alzaimar vorgeschlagen hat. Habe mir allerdings ein Objekt draus gemacht und nutze das ganze mit ner TObjectList. Bin heute nach der Arbeit dann wohl damit beschäftigt, mich in die VirtualListView einzuarbeiten.


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