Montag, 20. Juli 2009

Zeilen bewegen in Vim

In irgendeinem Editor habe ich mal gesehen, wie eine Tastenkombination zur Verfügung stand, die die aktuelle Zeile eins nach oben oder unten bewegte. Oder anders ausgedrückt: die die aktuelle Zeile mit der darüber oder darunter tauschte. Jetzt habe ich das mal in Vim als Tastaturbelegung »nachprogrammiert«. Folgende zwei Zeilen habe ich meiner ~/.vimrc hinzugefügt:

map <C-J> ddp
map <C-K> ddkP


Strg-J bewegt nun die aktuelle Zeile eins nach unten, Strg-K eins nach oben. Nett.

Montag, 13. Juli 2009

Lesen der Registrierdatenbank

In Free Pascal kann man auf die Windows-Registrierdatenbank zugreifen. Im Folgenden wird der Eintrag »Adapter ID« aus dem Schlüssel »Software\Microsoft\Screensavers\Text3D\Screen 1« im Baum HKEY_CURRENT_USER ausgelesen und angezeigt.

PROGRAM RegistryView;
USES Registry;

VAR
  buffer: ARRAY [0 .. 15] OF Byte;
  count : Integer;
  i     : Integer;
  r     : TRegistry;

BEGIN
  r := TRegistry.Create;
  r.RootKey := HKEY_CURRENT_USER;
  r.OpenKeyReadOnly('Software\Microsoft\Screensavers\Text3D\Screen 1');
  count := r.ReadBinaryData('Adapter ID', buffer, Length(buffer));
  r.Free;
  FOR i := 0 TO count - 1 DO BEGIN
    Write(HexStr(buffer[i], 2), '  ');
    IF (i + 1) MOD 16 = 0 THEN
      WriteLn;
  END;
END.


Die FOR-Schleife sorgt dabei für eine hexadezimale Ausgabe des Puffers.

Samstag, 11. Juli 2009

Rundung in Calc

Gibt man in Calc eine Zahl mit Nachkommastellen in eine Zelle ein, so wird diese Zahl standardmäßig auf zwei Nachkommastellen gerundet dargestellt. Wie lässt sich dieses Verhalten verändern, sodass stattdessen zum Beispiel die Zahl auf eine Ganzzahl gerundet wird?

Die nötige Option befindet sich im Menüpunkt Format => Zellen, im Reiter Zahlen. Im Abschnitt Optionen findet sich eine Einstellung für Nachkommastellen. Diese steht (zumindest bei mir) standardmäßig auf 0, davon sollte man sich aber nicht irritieren lassen, auch wenn eigentlich 2 dort stehen sollte. Man kann die 0 durch eine neue 0 ersetzen und bekommt dann tatsächlich für die vorher selektierten Zellen eine Rundung auf Ganzzahl.

Wichtig ist, dass man hier nur die Anzeige der Werte einstellt. Der Wert selbst bleibt so erhalten, wie man ihn ursprünglich eingegeben hat. Wenn man später das Format wieder auf mehr Nachkommastellen umstellt, so stellt sich heraus, dass Calc sich durchaus noch an die Nachkommastellen erinnert, die vorher da waren.

Mittwoch, 8. Juli 2009

Externe Variablen in Free Pascal

Vor kurzem schrieb ich über die Möglichkeit, das Datum und die Zeit des Kompilierens in einem Free-Pascal-Programm zu hinterlegen ({$I %DATE%} und {$I %TIME%}). Nun kann es vorkommen, dass man diese Daten in einem komplexeren Projekt mit vielen Units verwendet. Angezeigt werden sie zum Beispiel in einer Unit X. Diese Unit wird aber nicht immer neu kompiliert. Nur, wenn sich an der Unit X selbst etwas geändert hat, wird diese ja neu kompiliert. Wenn nicht, dann bleibt die Anzeige von Datum und Uhrzeit auf dem alten Stand.

Man muss nun also einen Teil des Projekts finden, der immer neu kompiliert wird. Das ist die Hauptprogrammdatei. Dann muss man in dieser Hauptdatei Variablen definieren, die Datum und Zeit aufnehmen. Auf diese Variablen kann dann aus der Unit X heraus zugegriffen werden. Hier ein Beispiel.

Das Hauptprogramm:
PROGRAM Test;
USES TestUnit;

VAR
BuildString: String = '[' + {$I %DATE%} + ' ' + {$I %TIME%} + ']';
CVAR; EXPORT;

BEGIN
TestOut;
END.
Die Unit, die Datum und Uhrzeit zur Anzeige bringt:
UNIT TestUnit;

INTERFACE

PROCEDURE TestOut;

IMPLEMENTATION

VAR
BuildString: String; CVAR; EXTERNAL;

PROCEDURE TestOut;
BEGIN
WriteLn('BuildString: ', BuildString);
END;

END.
Hier wird der Einfachheit halber nur eine Variable deklariert, die beides aufnimmt. Entscheidend ist, dass wir im Hauptprogramm die Variable zur Verwendung in anderen Units freigeben. Hier wird das durch CVAR; EXPORT; erreicht. In der Unit, die die Variable dann verwendet, wird die Variable als CVAR; EXTERNAL; deklariert, um anzuzeigen, dass auf eine Definition der Variable in einer anderen Übersetzungseinheit zugegriffen wird.