Denkfehler in BDE
Nicht alle Datensätze werden bei POST sofort auf Platte gespeichert !

Schreibvorgänge in Datenbanken auf der Festplatte dauern etwas länger als das Schreiben im RAM. Um Datenbankprogramme schneller wirken zu lassen, hat Borland in der BDE einen Cache-Puffer vorgeschaltet. Zu speichernde Datensätze landen zunächst recht schnell in diesem Puffer, später werden dann unbemerkt im Hintergund die Sätze in aller Ruhe auf Platte geschrieben.
Dies kann nun aber fatale Folgen haben, gerade wenn ein solches Programm im Netzwerk betrieben wird. Denn obwohl an einem Arbeitsplatz der Vorgang eigentlich abgeschlossen ist, ist die Datenbank für andere Benutzer zunächst noch gar nicht aktualisiert. Arbeiten auch diese an dem selben Datenbestand sind Indexfehler oder Datenverluste kaum zu verhindern.
Wir empfehlen deshalb, bei allen gleichzeitig benutzten Tabellen vom Typ TTable per Objektinspektor die Methode AfterPost zu modifizieren:

Procedure TForm1.AfterPost(DataSet: TDataset);
begin
  FlushDBBuffer(Dataset as TTable);
end;

wobei die Funktion "FlushDBBuffer" im Programm oder besser in einer Unit wiefolgt defniert werden muß:

function FlushDBBuffer(Const Table: TTable); DBIResult;
begin
  result:=DBISaveChanges(Table.Handle);
  if result<>DBIERR_NONE then DBIError(result);
end;

falls nicht schon vorhanden, müssen hierfür in der USES-Klausel die Units DB, DBTables, DBITypes, DBIErrs, DBIProcs defniert werden.

 INI-Datei Cache ?  
Auch INI-Datei-Änderungen werden nur verzögert auf Platte geschrieben
Ähnlich wie bei FlushDBBuffer (s.o.) werden u.U. Einträge in einer INI-Date zunächst in einem Cache-Puffer zwischengespeichert. Wird ein Programm im Netzwerk betrieben oder sollen andere Prozesse sofort auf die Änderungen reagieren, muß das Schreiben in dei INI-Date mit dem Leeren des Cache-Puffers abgeschlossen werden:
 

INIDatei:=TIniFile.create('c:\test.ini');
INIDatei.writestring('Abschnitt','Eintrag','Wert');
WriteProfileString(nil, nil, nil);
INIDatei.free;

Unter Windows XP wird immer mehr von massiven Problemen im Zusammenhang mit TInifile berichtet. Wegen des zusätzlichen Pufferns empfiehlt Borland selbst für alle NT-basierenden Systeme, 2000 oder XP, statt TInifile besser TMemInifile bei gleicher Syntax zu benutzen.

 Win Shutdown  
Windows herunterfahren, Neustarten, Benutzer abmelden

In manchen Anwendungen könnte es notwendig werden, Windows nach Beendigung einer Funktion herunterzufahren, neu zu starten oder auch nur den Benutzer abzumelden und mit der erneuten Benutzeridentifikation fortzufahren...

 

Procedure Shutdown;
begin
  ExitWindowsEx(EWX_SHUTDOWN,0);
end;

Procedure Restart;
begin
   ExitWindowsEx(EWX_REBOOT,0);
end;

Procedure LogOff;
begin
  ExitWindows(0,0);
end;

  

 Wer bin ich ?  
Ermittlung des Names des aktuellen Windows-Users
Vielleicht ist es erforderlich, den Namen des PC-Benutzers (wie er sich bei Windows angemeldet hat) zu ermitteln, um daraus Berechtigungen o.Ä abzuleiten. Folgende Funktion liefert als Rückgabewert den Namen des aktuellen Windows-Users:
 

uses registry;

function WindowsUser: String; // im Netzwerk, Win2000, XP
var u: array[0..127] of char;
    s: DWord;
begin
  sz:=Sizeof(u);
  GetUSerName(u,s);
  result:=u;
end;

function WindowsUser: String; // unter Windows 9x
var reg: TRegIniFile;
begin
  reg:=TRegIniFile.create('SOFTWARE\MICROSOFT\MS SETUP (ACME)\');
  result:=reg.ReadString('USER INFO','DefName', 'unbek. Benutzer');
  reg.free;
end;

 Windows-Version  
Welche Windows-Version wird verwendet ?
Um auf die verschiedenen Systemvorgaben reagieren zu können, kann innerhalb eines Programms die aktuell laufende Windows-Version bestimmt werden:
 

z.B. als Funktion...

function WinVersion: string;
var w: word;
begin
  w:=(LOBYTE(LOWORD(GetVersion))*100)
     +HIBYTE(LOWORD(GetVersion));
  case w of
  310: result:='Windows 3.1';
  395: result:='Windows 95';
  410: result:='Windows 98';
  490: result:='Windows Millenium';
  500: result:='Windows 2000';
  501: result:='Windows XP';
  end;
end;

 XP look & feel  
Ein Programm dem Aussehen von Windows XP anpassen
Die Programmierer sind eigentlich schon zu bedauern. Kaum hat man ein Programm lauffähig, bringt Mircosoft ein neues Betriebssystem und das eigene Produkt sieht optisch schon veraltet aus. Erstellt man aber spezielle Komponenten für Windows XP, ist das Programm u.U. unter Windows 9x wieder nicht mehr lauffähig. Was also tun, wenn man ein Programnm für mehrere Betriebssysteme passend anbieten will ?
 

Zunächst besorgt man sich ein XP-Manifest als Ressourcen-Datei, z.B.
WinXp.res als Download

Am einfachsten bindet man dann die XP-Manifest-Datei in das eigene Programm mit ein. Dies geschieht durch einfache Angabe als Ressourcen-Datei:

....
{$R *.dfm}
($R WinXP.res}          <-- dieses Zeile in Programm einbinden
...

Nun muß man nur dafür Sorge tragen, dass die Datei WinXP.res immer dem Programm im Programmverzeichnis beiliegt. So ist das fertige Programm unter allen Windows-Versionen lauffähig und sieht unter XP aus wie XP, unter Win-2000 entsprechend wie Win-2000.

Allerdings taucht hierbei ein Fehler in der Delphi-VCL bei allen Programmen auf, die die Komponente TListView verwenden. Beschreibung zur Behebung

 Popup-Menue  
Auf welcher Komponente wurde ein Popup-Menue aufgerufen ?
Moderne Programme benutzen heute Popup-Menues bzw. Kontext-Menues, die über die rechte Maustaste aufrufbar sind. Dabei kann ein definiertes Popup-Menue auch mehreren Komponenten zugewiesen werden. Innerhalb der Popup-Prozedur möchte man nun aber wissen, auf welche dieser Komponenten geklickt wurde, um das Popup-Menue aufzurufen...
 

Die Realisierung ist sehr einfach, wird jedoch in der Delphi-Dokumentation nicht erwähnt:

z.B.:   Stringvar := PopupMenu1.PopupComponent.Name;

oder if PopupMenu1.PopupComponent=Komponente then...

 Schriftart da ?  
Vor dem Ausdruck überprüfen, ob eine gewünschte Schriftart überhaupt installiert ist
Wird bei einem Ausdruck ein bestimmte Schriftart verwendet und das Programm auch auf anderen Rechnern weitergegeben, so sollte man vorab immer abfragen, ob diese Schriftart auf dem System überhaupt installiert ist...
 

uses Printers;

function Schriftartvorhanden(fontname: String): boolean;
var i: integer;
begin
  for i:=0 to Printer.fonts.count-1 do
  if Printer.fonts[i]=fontname then
  
begin
    result:=true; EXIT;
  end;
  result:=false;
end;

 Bild geladen ?  
Enthält eine verwendete Image-Komponente ein geladenes Bild (BMP oder JPG) ?

Verwendete Bilder werden oft erst während der Laufzeit in eine Image-Komponente geladen, um keinen unnötigen Speicherplatz zu verschwenden. Mit nachfolgender Funktion kann abgefragt werden, ob bereits ein solches Bild geladen wurde und nicht noch einmal geladen werden muss...

  if (Image1.Picture.Bitmap.Empty)   // für BMP-Dateien
and (Image1.Picture.Graphic = nil) // für JPG-Dateien
then ShowMessage('Kein Bild!')     // 'Kein Bild vorhanden'
BrowserScrollbars  
Die angezeigten Scrollbars von TWebBrwoser ausblenden
Wer in seinen Programmen die Komponente TWebBrowser zum Anzeigen von HTML-Dokumenten verwendet, den stören vielleicht die Scrolleisten. Gerade die Scrollbar am rechten Rand wird standardmäßig immer angezeigt, auch wenn das Dokument gar nicht so lang ist.
  Nachfolgende Zeilen schalten die Scrollbars ab. Diese Zeilen dürfen jedoch erst zur Ausführung kommen, wenn die HTML-Seite vollständig geladen ist (sonst kommt es zur Schutzverletzung). Deshalb uss dieser Code geeignet platziert werden, z.B. in der Webbrowser-Standardmethode "DocumentComplete":

procedure TFrom1.WebBrowserDocumentComplete(Sender....     )
begin
WebBrowser.OleObject.Document.Body.Style.OverflowY:='hidden';
WebBrowser.OleObject.Document.Body.Style.OverflowX:='hidden';

end;

 
 

ext. Links

Tipps & Tricks mit Quellcode

"Denkfehler in BDE" - Nicht alls Datensätze werden bei POST sofort auf Platte geschrieben
INI-Datei-Cache ? - Auch INI-Datei-Änderung landen nur verzögert auf der Platte
Windows Shutdown - Windows herunterfahren, Neustarten, Benutzer abmelden
Wer bin ich ? - Ermittlung des aktuellen Windows-Users
Windows-Version - Welche Windows-version wird verwendet ?
Windows XP look & feel - Programm an das Aussehen von Windows XP anpassen
Popup-Menue - Auf welche Komponente wurde geklickt, um Popup-Menu aufzurufen.
Schriftart installiert ? - Vor Ausdruck überprüfen, ob gewünschte Schriftart überhaupt möglich ?
Bild geladen ? - Enthält eine verwendete Image-Komponente ein geladenes Bild?
Scrollbars weg - Die Bildlaufleisten bei TWebBrowser ausblenden

Homepage des "DELPHI-Herstellers"
zurück (letzte Seite)HOME (Startseite)
TOPCOM Befehle32.pas (Download)
Einfach als Unit in Programm einbinden und schon stehen folgende, sinnvolle Befehls- erweiterungen (Beschreibung) zu Verfügung
DELPHI Super-Page    P.i.c.s Delphi-Fundgrube
Delphi-Source Tipps   Swiss Delphi-Center     
 Entwickler-Forum DELPHI Praxis.net