Archiv für: Februar 2007

Delphi, Strings splitten

Februar 27th, 2007 Autor: Phillip Kroll -

Borland DelphiIn den standard Bibliotheken von Delphi sucht man vergeblich nach Methoden zur komfortablen Stringverarbeitung. Man muss sich mit Pos, PosEx und Copy selber zusammenbauen was man braucht. Die häufigste Anwendung ist sicher, das spliten eines Strings aufgrund eines Trenners. Folgende Methode erledigt dies zuverlässig und schreibt jeden Teilstring in eine Zeile einer TStringList Instanz:

function SplitItWell( str, split : String ) : TStringList;
var
offset, last : integer;
begin
offset := 1;
last := 1;
Result := TStringList.Create;
if str = '' then Exit;
if length( str ) <= length( split ) then
begin
Result.Add( str );
Exit;
end;

repeat
offset := PosEx( split, str, offset );

if offset = 0 then
Result.Add( Copy( str, last, length( str ) ) )
else
begin
Result.Add( Copy( str, last, offset - last ) );
offset := offset + length( split );
last := offset;
end;

until offset = 0;
end;

SplitItWell erstellt eine Instanz von TStringList und zerlegt str in seine Einzelteile überall da wo split vorkommt.

Um die Stringliste wieder in einen String zu verwandeln genügt folgende Methode:

function AssembleItWell( stringList : TStringList; sep : String ) : String;
var
I : Integer;
begin
Result := '';

for I := 0 to stringList.Count - 1 do
if I = stringList.Count - 1 then
Result := Result + stringList[ i ]
else
Result := Result + stringList[ i ] + sep

end;

Als Anwendungsbeispiel sortiert folgender Code die Elemente in einem String alphanumerisch.

function SortStringBySeperator( str, sep : String ) : String;
var
SplitList : TStringList;
begin

SplitList := SplitItWell( str, sep );
SplitList.Sorted := True;
Result := AssembleItWell( SplitList, sep );
FreeAndNil( SplitList );

end;

Benötigte Units: StrUtils;

Delphi, konstanter Dezimalseperator

Februar 24th, 2007 Autor: Phillip Kroll -

Borland DelphiWenn man Anwendungen entwickeln möchte die nicht nur die nicht nur für den eigenen Rechner gedacht sind, sollte man dafür sorgen, dass man einen konstanten Dezimalseperator verwendet. Ansonsten ist man abhängig von der Ländereinstellung des aktuellen Computers. Das führt dazu, dass Funktionen die Gleitkommazahlen in Strings (z.B. FormatFloat( '0.0', 1.5 )) umwandeln, verschiedene Ausgaben produzieren: 1.5 oder 1,5.

Die Probleme die auftreten, wenn man die Strings wieder in eine Gleitkommazahl umwandeln will sind offensichtlich. Um den Dezimalseperator unabhängig von den Ländereinstellungen zu halten reicht folgender Code:

procedure TMainForm.FormCreate(Sender: TObject);
begin
SysUtils.DecimalSeparator := '.';
SysUtils.ThousandSeparator := ',';
end;

Da die Umwandlung eines Strings in eine Zahl immer ein kritischer Codeabschnitt ist empfiehlt es sich, Methoden die Gleitkommazahlen umwandeln, nochmal zu kapseln. So hat man einen einzigen kritischen Abschnitt und nicht dutzende über mehrere Units verteilt. Außerdem kann man so eigene Exceptions werfen und garantieren, dass der Seperator stimmt.

String in Double

function PStrToDouble( Str : String ) : Double;
begin
SysUtils.DecimalSeparator := '.';
try
Result := SysUtils.StrToFloat( Str );
Except
Result := 0;
if Str = '' then
RAISE EParsingException.Create( Str, 'Fehler beim Versuch, einen leeren String in eine Gleitpunktzahl umzuwandeln.' )
else
RAISE EParsingException.Create( Str, 'Fehler beim Versuch, einen String in eine Gleitpunktzahl umzuwandeln.' );
end;
end;

Double in String

function PDoubleToStr( Format : String; value : double ) : String;
begin
SysUtils.DecimalSeparator := '.';
Result := FormatFloat( Format, Value );
end;

EParsingException ist hier eine von Exception abgeleitete Klasse die eine komfortabel Möglichkeit bietet um Fehler, die beim Parsen auftreten können zu behandeln.

An der folgenden Deklaration kann man die Funktionalität ablesen:

type
EParsingException = class( Exception )
public
ErrorMessage : String;
Constructor Create( Source : String ); overload;
Constructor Create( Source : String; AdditionalMessage : String ); overload;
end;

Delphi, Arbeisspeicher Belegung ermitteln

Februar 13th, 2007 Autor: Phillip Kroll -

Borland DelphiFolgende Methode gibt an, wie viel Arbeitsspeicher ein Programm belegt. Der Rückgabewert ist in Bytes. Es empfiehlt sich also noch eine Umrechnung in KBytes oder MBytes.

function ProcessMemory : double;
var
pmc: PPROCESS_MEMORY_COUNTERS;
cb: Integer;
MemStat: tMemoryStatus;
begin

Result := 0;
MemStat.dwLength := SizeOf(MemStat);
GlobalMemoryStatus(MemStat);
cb := SizeOf(TProcessMemoryCounters);
GetMem(pmc, cb);
pmc^.cb := cb;

if GetProcessMemoryInfo(GetCurrentProcess(), pmc, cb) then
Result := Longint(pmc^.WorkingSetSize);

FreeMem(pmc);

end;

Ein Beispielaufruf wäre:

Showmessage( FormatFloat( '0.00', ProcessMemory / 1024 / 1024 ) + ' MByte belegt' );

Benötigte Units: PsAPI;

Delphi, Computernamen ermitteln

Februar 13th, 2007 Autor: Phillip Kroll -

Borland DelphiFolgende Methode ermittelt den Computernamen auf dem das Programm läuft. Das ist zum Beispiel nützlich wenn man feststellen möchte, ob das Programm von einem anderen Rechner kopiert wurde. Ein Kopierschutz auf Grund des Computernamens zu implementieren ist jedoch nicht zu empfehlen.

function GetComputerName: string;
var
buffer: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
Size: Cardinal;
begin
Size := MAX_COMPUTERNAME_LENGTH + 1;
Windows.GetComputerName(@buffer, Size);
Result := StrPas(buffer);
end;

Delphi, Zeilenumbrüche entfernen

Februar 13th, 2007 Autor: Phillip Kroll - 1 Kommentar

Borland DelphiUm in Delphi Zeilenumbrüche aus einem String zu entfernen kann man die folgende Methode verwenden. In diesem Fall wird ein Zeilenumbruch durch ein Leerzeichen ersetzt. Der Zeilenumbruch unter Windows wird in Delphi als #13#10 kodiert.

procedure ReplaceLineBreak( var str : String );
begin
str := StringReplace( str, #13#10, ' ', [rfReplaceAll]);
end;

Benötigte Units: SysUtils;

Welche Bestandteile findet man im Chromatin?

Februar 1st, 2007 Autor: Phillip Kroll -

Das Chromatin besteht aus Fasern die zu etwa gleichen Teilen aus DNA und Proteinen bestehen. Zusätzlich findet man noch eine kleine Menge an RNA. Ist das Chromatin stark komprimiert spricht man von Heterochromatin, bei geringer Komprimierung von Euchromatin. Der Proteinanteil besteht aus Histon- und Nichthistonproteinen.

Den Komplex, der entsteht wenn DNA um die Histone gewunden wird, bezeichnet man als Nukleosom. Nichthiston-Proteine sorgen für eine weitere Verdichtung des Chromatins.

Navigation


Suche


Linkblog