www.ewlab.de
Delphi 2006
Delphi 2005
Kylix
Delphi 6
Delphi 5
Delphi 4
Impressum
TreeDesigner
Experten
Korrekturen
D5: Korrekturen

Inhaltsverzeichnis

Korrektur zu dynamischen Arrays, Seite 229

Der am häufigsten von Lesern gemeldete Fehler im Buch sind die beiden Code-Zeilen auf Seite 229 oben: Richtig ist, daß dynamische Arrays in Delphi immer von Null beginnend indexiert werden. Das Listing müßte also wie folgt lauten, um einen Sinn zu ergeben:

var
  intArray: array of Integer;
begin
  intArray[0] := 0; // Schutzverletzung, da Speicher für Array noch nicht reserviert.
  SetLength(intArray, 100);
{$R+}
  intArray[0] := 0; // jetzt klappt´s
  intArray[100] := 0; // Fehler, da letzter Index 99.

Der letzte Zugriff in diesem Listing wird zur Laufzeit als ERangeError-Exception gemeldet, aber nur dann, wenn das Programm mit eingeschalteter Bereichsüberprüfungs-Option kompiliert wurde (dies wird oben durch das {$R+} sichergestellt).

Korrekturen und Verbesserungen zum TreeDesigner 3.0

1. Wenn ein Dokumentfenster so klein gemacht wird, daß weniger als eine Zahl zur Beschriftung auf die Lineale paßt, kommt es zu einer Division durch Null und somit zu einer störenden Fehlermeldung. Grund dafür ist ein Fehler in der Komponente TRuler.

2. Wenn ein MDI-Kindfenster maximiert wird, fehlt in der rechten oberen Fensterecke ein Schalter zum Rückgängig machen dieser Vergrößerung. Grund dafür ist, daß der TreeDesigner nicht über eine Original-Windows-Menüzeile verfügt, an deren rechtem Ende normalerweise diese Schalter angebracht werden.

Um Abhilfe zu schaffen, können Sie einen neuen Menüpunkt im Hauptmenü von TMainForm unterbringen, z.B. als Unterpunkt des Fenster-Menüs. Im Folgenden wird dieser Menüpunkt mit MDIMaximizeNormalize bezeichnet. Die folgende Methode für sein OnClick-Ereignis verkleinert ein maximiertes Fenster oder maximiert ein Fenster, das noch nicht maximiert ist:

procedure TMainForm.MDIMaximizeNormalizeClick(Sender: TObject);
begin
  if Assigned(ActiveMdiChild) then begin
   with ActiveMdiChild do
     if WindowState = wsMaximized then WindowState := wsNormal
       else WindowState := wsMaximized;
  end;
end;

Damit nun der Menüpunkt zur Programmlaufzeit einen sinnvollen Text enthält, je nachdem, ob das aktuelle Kindfenster maximiert ist oder nicht, kann noch das OnClick-Ereignis des übergeordneten Fenster-Menüpunkts bearbeitet werden. Es wird beim Öffnen des Fenster-Menüs ausgelöst, also immer bevor der Text des Menüpunkts am Bildschirm angezeigt wird:

procedure TMainForm.Fenster1Click(Sender: TObject);
// Aktualisiert den Status des Maximieren/Normalisieren-Menüpunkts
// kein MDI-Kindfenster aktiv -> Deaktivieren des Menüpunkts
// aktives MDI-Fenster ist maximiert -> “Normalisieren”-Text setzen
// aktives MDI-Fenster ist nicht maximiert -> “Maximieren”-Text setzen.
begin
  MDIMaximizeNormalize.Enabled := Assigned(ActiveMDIChild);
  if Assigned(ActiveMDIChild) then begin
   if ActiveMDIChild.WindowState = wsMaximized then
     MDIMaximizeNormalize.Caption := 'Dokument auf normale Größe bringen'
   else
     MDIMaximizeNormalize.Caption := 'Dokument auf maximale Größe bringen'
  end;
end;

Für die Hinweise bedanke ich mich bei Andreas Keppler.

3. Wenn Toolbars von unterhalb der Menüleiste am unteren Rand des Hauptfensters angedockt werden, wird ihre Position beim nächsten Programmstart nicht richtig wiederhergestellt. Im folgenden Beispiel ist die Vergrößerungs-Toolbar am unteren Rand angedockt:

DockStatusVorher

Nach einem erneuten Start wird diese Toolbar, je nach Position des Hauptfensters, beispielsweise wie folgt positioniert:

DockStatusFehler

Ursache ist, daß die Funktion RestoreDockStatus in der Unit TDUtil.pas die angedockte Toolbar vor dem erneuten, automatischen Andocken nicht richtig auf dem Bildschirm plaziert (dafür müssen die Zielkoordinaten innerhalb der DockSite erst mit ClientToScreen in Bildschirmkoordinaten umgerechnet werden).

Die korrigierte Version von RestoreDockStatus finden Sie hier; Sie können dadurch die alte Version der Funktion in TDUtil.pas komplett ersetzen.

Danke für den Hinweis an Christian Hilk.

TRuler-Komponente

Die TRuler-Komponente verursacht eine Division durch Null, wenn der Platz zum Zeichnen der Beschriftung nicht mehr ausreicht. Zur Korrektur genügt es, zwei Zeilen in die Methode TRuler.Paint einzufügen (Datei complib\rulers.pas). Wenn Sie die rulers.pas nicht modifiziert haben, können Sie sich an den im Folgenden angegebenen Zeilennummern orientieren, ansonsten an den zitierten Inhalten vor bzw. nach der Einfügeposition:

// für das Delphi 4-Buch gelten andere Zeilennummern, siehe D4-Korrekturen!
procedure TRuler.Paint
...
if MaxNum < 0 then inc(TextAbst, Canvas.TextWidth('9')); // zusätzlicher
                                             //Platz für das Minus-Zeichen
- ** einfügen als Zeile 207: -
if TextAbst <= PaintWidth then begin
  TextSteps:=PaintWidth div TextAbst; { maximale Anzahl von Beschriftungen }
  ...
  end;
- ** einfügen als Zeile 258: -
end;
if not IsHorizontal then begin
...

Korrektur zum WebCollector

Das Programm zeigt in der Listbox unter Source - Frames eine andere Frames-Liste an, als es intern bei der Analyse der HTML-Tags verwendet. Dies kann unter anderem zu dem Fehler führen, daß im Bereich Source statt des HTML-Quelltextes eines Frames eine Fehlermeldung erscheint. Außerdem wird die Frames-Liste nicht aktualisiert, wenn zu einem anderen Frame navigiert wird. Um diese Probleme zu beheben, müssen zwei Methoden der Datei browserForm.pas korrigiert werden.

Das Update als Textdatei

Die genannten Fehlersymptome treten übrigens aus bisher unerforschten Gründen nicht mit allen Versionen des Internet Explorers auf; auf dem Testsystem des Autors etwa war der Fehler zunächst nicht sichtbar. Danke daher für den Hinweis an Hermann Mendel.

CD-ROM zum Buch

Für die Installation der Delphi 5-Testversion müssen Sie sich bei Borland/Inprise registrieren lassen. Das Programm delphi5\install.exe leitet Sie durch diesen Registrierungsprozeß. Wenn Sie die Installation vom Autostart-Programm der CD-ROM aufrufen wollen, wird jedoch delphi5\install\setup.exe aufgerufen, welches voraussetzt, daß die Registrierung schon abgeschlossen ist. In diesem Fall sollten Sie das Programm delphi5\install.exe manuell aufrufen. (Das erwähnte Autostart-Programm heißt starter.exe und ist erst auf der neuen Version der Buch-CD vorhanden, betrifft also nicht alle Leserinnen und Leser.)

TFontComboBox-Beispielkomponente

Auf Seite 732 ist von drei Properties die Rede, die in TComboBox veröffentlicht sind und die in TFontComboBox als protected redeklariert werden. Diese Redeklaration hat jedoch keine Wirkung, da einmal veröffentlichte Properties nicht wieder versteckt werden können. Sie können daher die TComboBox-Properties auch in TFontComboBox im Objektinspektor sehen und ändern. Die drei Property-Deklarationen im ersten Listing von Seite 732 sind somit unnötig.

Ergänzung zu Seite 627

Die Ergänzung hierzu ist dieselbe wie für Seite 696 des Delphi-6-Buchs.

Ergänzung zu Seite 933

Auf Seite 933 wurde unter "Herkunft des GUID" vergessen zu erwähnen, daß Sie im Delphi-Editor mit Shift+Strg+G jederzeit einen neuen GUID erzeugen können - ohne den Umweg über eine Typenbibliothek, der in der Standard-Version von Delphi ja gar nicht verfügbar ist.

THistoryList / THistoryCombo

Ein Fehler in THistoryList / THistoryCombo ist hier beschrieben.

Weitere Korrekturen

Anmerkungen zum Beispielprogramm ThreadDemo1 finden Sie auf der Korrekturseite zum Delphi 4-Buch.

Zurück

[www.ewlab.de] [Delphi 2006] [Delphi 2005] [Kylix] [Delphi 6] [Delphi 5] [Delphi 4] [Impressum]