Kurz & knapp, Gentechnik Begriffe

August 16th, 2007 Autor: Phillip Kroll -

Blunt ends

Als glatte Enden (Blunt ends) werden Enden eines doppelsträngigen DNA-Moleküls bezeichnet an dem keine ungepaarte Baase eines Stranges über den anderen hinausreicht. Es gibt Restriktionsendonucleasen, die DNA-Moleküle so schneiden, dass zwei glatte Enden entstehen.

Contig

Durchgänge DNA-Sequenz die aus überlappenden Fragmenten ermittelt wurde. Dies geschieht bei größeren Sequenzierungsprojekten rechnergestützt.

DNA-Hybridisierung

DNA-Einzelstränge die komplementär zueinander sind, neigen zur spontanen Ausbildung eines Doppelstrang-Moleküls unter Bildung von Wasserstoffbrückenbindungen. Dieser Vorgang wird auch als DNA-Hybridisierung bezeichnet und ist temperaturabhängig.

DNA-Marker

DNA-Marker sind Orte in einem Genom die in einer Population eine gewisse Varianz aufweisen. Dazu gehören RFLPs, VNTRs, STRs, SNPs und CNVs. Dies kann zur Erstellung von Genkarten oder zur Gendiagnose genutzt werden.

DNA-Sonde

DNA-Sonden sind einzelsträngige DNA-Moleküle mit bekannter Sequenz die radioaktiv (z.B. mit 32P) oder enzymatisch markiert sind. Aufgrund ihrer Fähigkeit mit komplementären DNA-Sequenzen zu hybridisieren, kann eine Sequenz auf einem DNA-Molekül mithilfe einer DNA-Sonde identifiziert werden. Anwendungsbeispiele:

  1. In-situ-Hybridisierung mit einer fluoreszenzmarkierten Sonde (FISH) zur Lokalisierung eines Genortes.
  2. Identifikation eines DNA-Moleküls auf dem Autoradiogramm eines Souther-Blot Gels.

Homopolymerschwänze

Sind Enden einer DNA-Sequenz die aus einer einzigen Art von Nukleotiden aufgebaut sind. Beispiel dafür ist der Poly(A)-Schwanz der in eukaryotischen Zellen im Zuge der posttranslationalen Modifikation an das 3’-Ender der prä-mRNA synthetisiert wird. In-vitro können Homopolymerschwänze an DNA-Doppelstränge mit glatten Enden angefügt werden was zur Bildung von klebrigen enden führ.

In-situ-Hybridisierung

Ermöglicht die Lokalisierung von DNA-Sequenzen auf Chromosomen. Die Chromosomale DNA wird denaturiert so dass die komplementären Stränge aufschmelzen. Dies ermöglicht einer DNA-Sonde an komplementären Sequenzen zu hybridisieren und diese so nachhaltig zu markieren. Die Lokalisierung ist dann anhand der Fluoreszenzeigenschaften der Sonde möglich.

Insertionsvektor/Substitutionsvektor

Auf dem Lamda-Phagen basierende Vektoren können in Substitutions- und Insertionsvektoren unterteilt werden. Insertionsvektoren ermöglichen das einbringen von zusätzlicher fremd-DNA an einer einzigen Schnittstelle. So können allerdings nur geringe mengen an DNA in den Vektro eingebaut werden (bis 5 kb). Substitutionsvektoren besitzen zwei Schnittstellen für Restriktionsenzyme, die ein für die Replikation unwichtiges Stück herausschneiden. Dieses entfernte Stück kann durch eine wesentlich größere Menge an DNA (bis zu 24 kb) ersetzt bzw. substituiert werden.

Kilobase

Kilobase ist eine Einheit für die Länge von DNA Sequenzen. Sie gibt an aus wie vielen Basen ein DNA-Molekül besteht. Eine Kilobase (kb) entspricht dabei 1000 Nukleotiden/Basen.

Klebrige Enden

Als klebrige Enden (engl.: sticky ends) bezeichnet man einsträngige Fortsätze am Ende eines doppelsträngigen DNA-Moleküls. Zwei komplementäre Enden (wie sie beispielsweise bei der Behandlung mit Restriktionsendonukleasen entstehen können) neigen dazu zu hybridisieren und somit einen durchgehenden Doppelstrang zu bilden, daher sticky ends. Es wird allerdings noch eine Ligase benötigt um die enden der Einzelstränge kovalent zu verknüpfen.

Klonierung

Als Klonierung bezeichnet man den Vorgang, bei dem eine beliebige DNA-Sequenz in einen Vektor (z.B. Plasmid, Phage) eingebracht wird. Dies geschieht meist um mit Hilfe des erstellten Vektors ein Transgen in einen Organismus einzuschleusen.

Ligation

Enzymatische Verknüpfung des 3’-Hydroxy-Endes eines Nukleotids mit dem 5’-Phospat-Ende eines anderen Nukleotids. Nach der Hybridisierung von klebrigen Enden eines Vektor-Moleküls mit einem zu klonierenden Gen wird beispielsweise Ligase benötigt um die beiden entstandenen Lücken kovalent zu schließen (Ligation).

Linker

Linker sind DNA Fragmente, die an einen DNA-Doppelstrang mit glatten Enden angefügt werden können um so klebrige Enden zu erzeugen. Sie bestehen aus kurzen bekannten Sequenzen mit glatten Enden sowie einer Schnittstelle für ein Restriktionsenzym. Nach dem anfügen der Linker und der Behandlung mit dem entsprechenden Restriktionsenzym ergeben sie klebrig Enden.

Adapter

Adapter sind kurze DNA-Fragmente mit bekannter Sequenz, die ein klebriges und ein glattes Ende besitzen. Sie werden an DNA-Sequenzen ligiert um sie mit definierten klebrigen Enden auszustatten. Durch die Modifikation der klebrigen enden der Adapter kann verhindert werden, dass sie nach einer dimerisierung durch Ligase verknüpft werden. Dies verhindert das erneute entstehen von glatten Enden durch dimerisierte Adapter.

Mikrosatellit

Kurze, nicht-codierende DNA-Sequenzen die sich oft in dem Genom eines Organismus wiederholen. Sie können Ursache für Restriktionslängen Polymorphismen (RFLP) sein.

Plasmid

Plasmide sind kleine, zirkuläre DNA-Moleküle die sich unabhängig von Genom einer Bakterienzelle replizieren können. Sie kommen meist in mehreren Kopien vor und eignen sich daher als Vektoren für die Klonierung.

Primer

Kurze DNA oder RNA-Oligonukleotide mit bekannter Sequenz. Sie werden benötigt um nach einer Hybridisierung mit einem DNA-Fragment als Replikationsursprung für den DNA-Polymerase-Komplex zu dienen. Die Polymerase-Kettenreaktion (PCR) ist z.B. auf das Vorhandensein von komplementären Primern zur Amplifizierung von DNA angewiesen.

Repetetive DNA

Repetetive DNA Elemente sind nicht-codierende Sequenzen die sich im Genom mehrfach hintereinander wiederholen. Zu repetetiven Elementen gehören variable number tandem repeats (VNTR) und short tandem repeats (STR). Sie können als DNA-Marker funktionieren oder zur Erstellung eines genetischen Fingerabdrucks verwendet werden.

Replikationsstartpunkt

Der Replikationsstartpunkt oder origin of replication (ori) ist eine Sequenz in einem Genom, die als Startpunkt für die Replikation eines DNA-Moleküls dient. Vektoren wie z.B. Plasmide oder Phagen verfügen über einen ori um Ihre Replikation in der Wirtszelle sicher zu stellen.

RFLP

Der Verdau von DNA-Sequenzen mit einem oder mehreren unterschiedlichen Restriktionsenzymen resultiert in einem charakteristischen Gemisch von DNA-Fragmenten unterschiedlicher Länge. Durch Mutationen, die Restriktionsstellen verschieben oder Erkennungssequenzen für Restriktionsenzyme verändern kann dieses Fragment-Gemisch von einer Vergleichsprobe abweichen. Dies kann zur Erstellung von genetischen Fingerabdrücken oder zur Aufklärung von Verwandtschaftsbeziehungen genutzt werden.

Southern Blot

Southern Blot ist ein Verfahren zum Nachweis von DNA-Sequenzen in einem Gemisch von DNA.
Ablauf:

  1. Isolation der DNA aus der Probe
  2. Behandlung der aufgereinigten DNA mit einem oder mehreren unterschiedlichen Restriktionsenzymen
  3. Gelelektrophoretische Auftrennung des Gemisches aus DNA-Fragmenten nach ihrer Größe
  4. Übertragung der DNA-Fragmente auf eine Nylon-Membran (Southern Blot)
  5. Fixierung der Fragmente auf der Nylon Membran (z.B. Hitzebehandlung)
  6. Hinzufügen einer farbstoff- oder radiomarkierten Sonde mit komplementärer Sequenz
  7. Hybridisierung der Sonde und anschließendes abwaschen nicht hybridisierter Sonden
  8. Nachweis auf durch Autoradiogramm oder Farbreaktion

Delphi, Integer und Float Werte einlesen

Juli 28th, 2007 Autor: Phillip Kroll -

Um schnell und sicher die Eingabe eines TEdit Feldes auszuwerten kann man folgende Methoden zentral ablegen und global verwenden. Es wird dafür gesorgt, dass nur gültige Integer bzw. Float Werte akzeptiert werden. Die Methoden liefern True zurück, wenn die Eingabe gültig ist. In Value wird das Ergebnis geschrieben, falls die Umwandlung erfolgreich war. Falls ein Fehler auftritt wird eine Warnung angezeigt und der Rückgabe Wert ist False.

function ReadFloatFromEdit( var value : double; Edit : TEdit ) : boolean;
begin
Result := True;
try
value := StrToFloat( Edit.Text );
except
Result := False;
MessageDlg( '"' + Edit.Text + '" ist keine gültige Eingabe.', mtWarning, [ mbOK ], 0 );
end;
end;

function ReadIntFromEdit( var value : integer; Edit : TEdit ) : boolean;
begin
Result := True;
try
value := StrToInt( Edit.Text );
except
Result := False;
MessageDlg( '"' + Edit.Text + '" ist keine gültige Eingabe.', mtWarning, [ mbOK ], 0 );
end;
end;

Ein Beispiel Aufruf könnte folgendermaßen aussehen:

...
var
tolerance : double;
begin
if not ReadFloatFromEdit( tolerance, Edit1 ) then Exit;
...

Kurz & Knapp, Maxam-Gilbert-Sequenzierung

Juli 27th, 2007 Autor: Phillip Kroll -
  1. Ausgangsmaterial ist aufgereinigte, doppelsträngige DNA auf vier Proben aufgeteilt
  2. Jeder DNA Strang wird am 5' Ende mit einem radioaktivem Phosphat (32P) markiert
  3. Aufschmelzen der doppelsträngigen DNA in Einzelstränge durch Detergenzien und Erhitzen (90°C)
  4. Verschiedene Chemikalien für spezifische Spaltreaktionen werden in jede der vier Proben gegeben
  5. Stränge werden an spezifischen Basen gespalten
  6. Jede Probe wird separat gelelektrophoretisch aufgetrennt
  7. Übertragung auf ein Autoradiogramm
  8. Ablesen der Banden in Laufrichtung ergibt die Sequenz

Scilab, Exponentielles Wachstum/Zerfall

Juli 18th, 2007 Autor: Phillip Kroll -

Hier der Scilab Code zum plotten von Exponentiellen Wachstums- bzw. Zerfallsprozessen [y=x0*e^(x*a)] mit der dazugehörigen Trajektorie.

clf;

// Anfangsparameter
x0 = -4;
a = -0.05;

// Beschriftung
labelStr = "(a=" + string(a) + " x0=" + string(x0) + ")";

// x(t)
y=x0*%e^(x*a);

// x'(t)
ydot = x0*a*%e^(x*a);

// oberer graph, x(t) gegen t
subplot(2,1,1);
plot(x, y );
set( gca(),"grid",[1 1]);
xtitle( "Zeitverlauf " + labelStr, "t", "x(t)");

// unterer graph, x(t) gegen x'(t)
subplot(2,1,2);
plot(y, ydot );
set( gca(),"grid",[1 1]);
xtitle( "Trajektorie " + labelStr, "x(t)", "x''(t)" );

Exponentielles Wachstum bzw. Zerfall

Genetische Algorithmen (in JavaScript)

Juni 21st, 2007 Autor: Phillip Kroll -

Vorweg: JavaScript ist sicherlich nicht die erste Wahl für die Implementierung von genetischen Algorithmen ;- )

Algorithmen

Aufgabe: Bestimmen Sie die Nullstelle der Funktion f(x) = e^x − tan(x) im Intervall [0, 1.5] mit dem Mutations-Selektions-Verfahren mit Zufallszahlen in [0, 10000] und einer maximalen Änderung des Arguments um 0.05. Berechnen Sie 5 Iterationen.

>> Skript starten

Genetischer Algorithmus der per Mutation und Crossing over die Parameter für eine Funktion findet (f(x1,x2,x3,x4,...)=|x1-x2| + |x2-x3| + |x3-x4| + ...; Fitnessfunktion: F(x1,x2,x3,x4,..) = 0

>> Skript starten

Genetischer Algorithmus der per Mutation und Crossing Over diskrete Stützstellen an eine Funktion anpasst: (f(x) = e^x - tan(x); Fitnessfunktion: F(x1,x2,..) = (e^x1-tan(x1))^2 + (e^x2-tan(x2))^2 + ... ) = 0

>> Skript starten

Info: An den Quelltext gelangt man jeweils per rechts klick.

The K+ channel gene, Das K+ Kanal Gen

Juni 21st, 2007 Autor: Phillip Kroll -

Vortrag über "The K+ channel gene, Kcnb1: genomic structure and characterization of its 5‘-regulatory region as part of an overlapping gene group", Autoren: Karim Roder and Gideon Koren.

Download

>> Der Vortrag
>> Das Handout

Einführung in Systemmodellierung mit SBML

Juni 21st, 2007 Autor: Phillip Kroll -

Ein Vortrag über SBML (System Biology Markup Language) für das Fach Gsim (Graphische Simulation)

Inhalte

  • Allgemeines (Motivation, Was gibt es?, Was ist SBML? und was nicht?, SBML besteht aus Ebenen, SBML Level 2, Features von SBML Level 2, Elemente in SBML Modellen, Für Programmierer: libSBML)
  • Das Eingemachte (SBML Dokumente, SBML Modelle im JDesigner, SBML Code für reactions)
  • Modelle simulieren (Zeitverlauf, Zeitverlauf Simulation, Steady State Berechung, Reversible Massenreaktion, SBML Code, Enzymkinetik, Zusammenfassung, Quellen)

Download

>> Der Vortrag
>> Das Handout

Delphi, Spalte in einem StringGrid löschen/einfügen

Mai 28th, 2007 Autor: Phillip Kroll -

Die TStringGrid Komponente stellt keine Möglichkeit zur Verfügung um Spalten oder Zeilen mitten im Grid zu löschen. Folgende Methode ermöglicht das löschen von Spalten:

function DeleteCol( Grid : TStringGrid; Col : Integer ) : boolean;
var
I, j : Integer;
begin
Result := False;
if ( Col < 0 ) or ( Col >= Grid.ColCount ) then Exit;
for I := Col to Grid.ColCount - 2 do
for J := 0 to Grid.RowCount - 1 do
Grid.Cells[ I, J ] := Grid.Cells[ I + 1, J ];
Grid.ColCount := Grid.ColCount - 1;
Result := True;
end;

Eine Mögliche Anwendung wäre zum Beispiel das Löschen aller markierten Spalten in einem StringGrid:

procedure TForm1.Spaltelschen1Click(Sender: TObject);
var
I, left, right: integer;
begin
left := StringGrid.Selection.left;
right := StringGrid.Selection.right;
for I := 0 to right - left do
DeleteCol( StringGrid, left );
end;

Um eine neue leere Spalte in ein StringGrid einzufügen hilft folgende Funktion weiter:

function InsertCol( Grid : TStringGrid; Col : Integer ) : boolean;
var
I, j : Integer;
begin
Result := False;
if ( Col < 0 ) or ( Col >= Grid.ColCount ) then Exit;
Grid.ColCount := Grid.ColCount + 1;
for I := Grid.ColCount - 1 downto Col + 1 do
for J := 0 to Grid.RowCount - 1 do
if I <> Col + 1 then
Grid.Cells[ I, J ] := Grid.Cells[ I - 1, J ]
else
Grid.Cells[ I, J ] := '';
Result := True;
end;

Delphi, Leere Spalte in einem StringGrid finden

Mai 28th, 2007 Autor: Phillip Kroll -

Wenn man eine intelligente Methode schreiben möchte um den Inhalt einer TStringgrid Komponente zu aktuallisieren hilft einem diese Komponente nicht viel weiter. Eine Nütliche Funktion ist zum Beispeil das Auffinden einer leeren Spalte um in diese dann neuen Inhalt zu schreiben. Folgende Funktion ermittelt die erste auffindbare leere Spalte in einem StringGrid. Wenn keine leere Spalte gefunden werden kann gibt sie -1 zurück.

function FindEmptyCol( Grid : TStringGrid ) : integer;
var
I, J: Integer;
begin
Result := - 1;
for I := 0 to Grid.ColCount - 1 do
for J := 0 to Grid.RowCount - 1 do
begin
if Grid.Cells[ I, J ] <> '' then break;
if J = Grid.RowCount - 1 then
begin
Result := I;
Exit;
end;
end;
end;

Petrinetze, Roboter Aufgabe

Mai 5th, 2007 Autor: Phillip Kroll -

Aufgabe:

Zeichnen Sie ein Petri-Netz, das folgende Aufgabenstellung modelliert:
In einer Fabrikhalle steht ein vollautomatisch arbeitender Aufzug für Paletten. Die Paletten werden vom Erdgeschoss in den ersten Stock befördert. Im Erdgeschoss befindet sich ein Förderband, das jeweils 1 Palette in den Aufzug hinein befördern kann. Ebenso befindet sich dort ein Roboter, der eine neue Palette auf dieses Förderband setzt, sofern es nicht (mehr) mit einer Palette belegt ist. Die Fördereinrichtungen des ersten Stocks brauchen Sie nicht zu modellieren.

Der Roboter hat die folgende Zustände: abgabebereit, Abgabe findet statt, Palette ist abgegeben. Das Förderband ist entweder ein- oder ausgeschaltet. Der Aufzug befindet sich entweder oben oder unten, oder er ist von unten nach oben bzw. von oben nach unten unterwegs.

Ihr Petri-Netz soll so einfach wie möglich sein (unnötig komplizierte Lösungen geben Punktabzug) und trotzdem mindestens die genannten Zustände enthalten. Die Parallelität darf nicht unnötig eingeschränkt werden! Beispielsweise kann der Roboter bereits eine neue Palette aufsetzen, während der Aufzug nach oben fährt. Achten Sie darauf, dass kein Crash passieren kann. Beispielsweise darf das Förderband nur laufen, wenn sich der Aufzug unten befindet. Der Aufzug darf nur in bestimmten Fällen starten, und so weiter. Sind eventuell weitere Zustände notwendig? Zeichnen Sie die Anfangsmarkierung so ein, dass sie einer Situation entspricht, in der sich noch keine Palette im System befindet.

Lösung:

roboter förderband aufzug petrinetz

Petrinetze, Fenster öffnen

Mai 5th, 2007 Autor: Phillip Kroll -

Petrinetz zum öffnen und schließen eines Fensters

fenster petri netz

Petrinetze, Schlüssel im Türschloss

Mai 5th, 2007 Autor: Phillip Kroll -

Petrinetz für das Aufschließen einer Tür

Nitrile und Aldehyde

Mai 5th, 2007 Autor: Phillip Kroll -

Nitride und Aldehyde

Oxocarbonsäuren/Ketocarbonsäuren

Mai 5th, 2007 Autor: Phillip Kroll -

oxocarbonsäuren

Chlorcarbonsäuren

Mai 5th, 2007 Autor: Phillip Kroll -

Chlorcarbonsäuren

Hydroxycarbonsäuren

Mai 5th, 2007 Autor: Phillip Kroll -

Hydroxycarbonsäuren

Dicarbonsäuren

Mai 5th, 2007 Autor: Phillip Kroll -

But-2-endisärue

Verbindungen mit vier Kohlenstoff Atomen

Mai 5th, 2007 Autor: Phillip Kroll -

Verbindungen mit vier  Kohlenstoff Atomen

Hexan, Hexen, Hexin

Mai 5th, 2007 Autor: Phillip Kroll -

Verschiedene Beispiele für Nomenklaturen des Hexans, Hexens und Hexins

Hexan, Hexen, Hexin

Animation biologischer Prozesse

März 15th, 2007 Autor: Phillip Kroll -

www.Maxanim.comUnter der URL Maxanim.com findet man eine vielzahl an Animationen zu Themen rund um die Biologie.

  • Genetics Animations
  • Biochemistry Animations
  • Immunology Animations
  • Physiology Animations
  • Microbiology Animations

Wer also in Farbe und Ton erzählt bekommen möchte, wie genau man cDNA macht und warum überhaupt oder wie exakt eine PCR oder RFLP abläuft findet hier die passenden Animationen.

>> Maxanim.com

Sulfonamide und Trimethoprim

März 6th, 2007 Autor: Phillip Kroll -
  • Hemmen beide die Synthese von Folsäure in Bakterien und können so antibiotisch wirken
  • Tierische und menschliche Zellen produzieren Folsäure nicht selbst sondern nehmen sie als Nährsthoffe auf. Sie sind also nicht von Sulfonamiden oder Trimethoprim betroffen
  • Folsäure ist notwendig für den Aufbau der DNA
  • Sulfonamide müssen hoch dosiert verabreicht werden, da ihre bakteriostatische Wirkung auf kompetetiver Hemmung eines Enzyms im folsäure-synthetisierenden Stoffwechsel beruht.
  • Die bakteriostatische Wirkung der Sulfonamide werden 1936 entdeckt und liegt damit zeitlich noch vor der Entdeckung des Peniclillin 1949.
  • Bakterien können leicht Resistenzen gegen Sulfonamide entwickeln deswegen werden Sulfonamide immer nur im Kombination mit Trimethoprim verabreicht.
  • Trimethoprim greift ebenfalls hemmend in die Synthese von Foläure ein, tut dies jedoch an anderer Stelle. So kann die Kombination von Sulfonamiden und Trimethoprim die Bildung von Resistenzen deutlich unwahrscheinlicher machen
  • Da Sulfonamide und Timethoprim als Antimethabolite wirken, sind sie sowohl gegen gram positive als auch gram negative Bakterien wirksam.

Delphi, Gleitkommazahl in Integer casten

März 6th, 2007 Autor: Phillip Kroll -

Borland DelphiEs gibt generell zwei Möglichkeiten eine Gleitkommazahl in eine ganze Zahl umzuwandeln. Man kann entweder runden oder einfach die Nachkommastellen abschneiden, also casten.
Wenn man in Delphi einen Double Wert in einen Integer Wert casten möchte könnte man auf die Idee kommen das folgendermaßen zu tun:

...
var
int : Integer;
dbl : Double;
begin
int := Integer( dbl );
...

Das wird der Compiler aber nicht durchgehen lassen, stattdessen funktioniert folgender Code

...
var
int : Integer;
dbl : Double;
begin
int := Trunc( dbl ); // Trunc(1.9) results in 1
...

Möchte man aus einem Double Wert einen Integer machen und die Nachkommastellen dabei runden, geht dies wie folgt:

...
var
int : Integer;
dbl : Double;
begin
int := Round( dbl ); // Round(1.9) results in 2
...

Weitere Möglichkeiten für die Typumwandlung von Double in Integer sind zwei Methoden, die in der Unit Math zu finden sind: Ceil und Floor. Floor gibt den größten Integer Wert zurück der kleiner als der Übergebene Double Parameter ist und Ceil erledigt das Gegenteil. Hier ein paar Beispiele:

Floor(-2.8); // = -3
Floor(2,8); // = 2
Floor(-1,0); // = -1
Ceil(-2.8); // = -2
Ceil(2,8); // = 3
Ceil(-1,0); // = -1

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;

:: Nächste Seite >>

Navigation


Suche


Linkblog