Schönen guten Abend,
ich war früher viel in einem anderen Forum unterwegs, welches aber leider geschlossen wurde. Aus dem Grund mache ich jetzt meine ersten Versuche hier auf Delphi-Praxis. Mögliche Fehlbedienungen möge man mir nachsehen
Ich habe ein seit längerem andauerndes Projekt, bei dem ich eine Anzahl von Strings verwalte. Jedes Zeichen eines Strings steht für Objekte (Amino- oder Nukleinsäuren) und ich führe darauf Wiederholungs- und Ähnlichkeitsanalysen durch. Jeder String ist ein Teil eines Records und trägt zusätzlich eine Feld für einen Namen. Die Strings verwalte ich in einer tList. Die grundlegende Idee habe ich im folgenden einmal skizziert:
Delphi-Quellcode:
Type
pOneSequence = ^tSequence;
tSequence = Record
Name : String;
Data : String;
end;
tSequenceList = class(TObject)
Private
fSequenceList : tList;
Public
Constructor Create;
Destructor Destroy;
Function NewSequence : Integer;
Function SortListAscendingByName : Boolean;
// [...]
end;
Implementation
Constructor tSequenceList.Create;
Begin
Inherited Create;
fSequenceList := TList.Create;
end;
Destructor tSequenceList.Destroy;
Var i : Integer;
aRecord : pOneSequence;
Begin
For i := fSequenceList.Count - 1 downto 0 do
Begin
aRecord := fSequenceList.Items[i];
Dispose (aRecord);
fSequenceList.Delete (i);
end;
Inherited Destroy;
end;
Function CompareNamesAscending(Item1, Item2: Pointer): Integer;
Begin
Result := AnsiStrIComp (PChar (pOneSequence(Item1)^.Name), PChar (pOneSequence (Item2)^.Name));
end;
Function tSequenceList.SortListAscendingByName : Boolean;
Begin
Try
fSequenceList.Sort (@CompareNamesAscending);
Result := True;
Except
Result := False;
end;
end;
Durch einige Weiterentwicklungen würde ich ein ähnliches System nun gerne für Zahlen und Matritzen anwenden. Dazu ist meine Überlegung, daß ich den Datentyp tSequence erweitere. Leider geht natürlich so etwas nicht:
Delphi-Quellcode:
tSequenceType = (seqNumericList = 0,
seqNumericArray = 1,
seqString = 2);
t1dVariantArrayDouble= Record
Title : String;
RowTitles : Array of String;
Cells : Array of Double;
end;
t2dVariantArrayDouble= Record
Title : String;
RowTitles : Array of String;
ColTitles : Array of String;
Cells : Array of Array of Double;
end;
tSequence = Record
Name : String;
Case SeqType : tSequenceType of
seqNumericList : (Data : t1dVariantArrayDouble);
seqNumericArray : (Data : t2dVariantArrayDouble);
seqText : (Data : String);
end;
Als einfachstes Rumpfuschen bestünde nun die Option einen klassischen Record zu verwenden und dort alle offenen Arrays drin zu implementieren. Die Teile die genutzt werden würden gesetzt, der Rest auf die Länge Null minimiert. Letztlich geht es mir um die Frage des Datendesigns und wie man es am sinnigsten implemetieren kann.
Es ist mir klar, daß ich viel ändern muss, wenn ich zukünftig auch solch unterschiedlichen Elemente bearbeiten will, aber die Frage ist nun wie geht man da am Besten ran. Hierzu bin ich nun brennend dran interessiert, was andere Leute für Lösungsansätze wählen würden.
Da die Funktionalität des Programms in der letzten Zeit deutlich an Umfang zugenommen hat, ist damit zu rechnen, daß später evtl. noch andere Datentypen in der Liste untergebracht werden können. Jetzt ist noch so einer der letzten Punkte, daß ich 'Altlasten' ausbügeln kann.
Momentan erscheint mir am sinnigsten, daß man hier evtl. zwei Klassen aufbaut. Die eine, die Daten verwaltet, die andere die Objekte der ersten Klasse verwaltet. Oder hat noch jemand andere Ideen? Falls ja, wie würde sich das dann äußern, bzw. wie würde es dann aussehen. Ich bin momentan in der verzwickten Lage, das ich eines dieser als 'Quick'n'dirty' geplanten Programme versuche auf eine evtl. zukunftsweisende Richtung umzustellen (auch wenn es bisher nur umsonst für einen kleinen Nutzerkreis zur Verfügung gestellt ist...)
Liebe Grüße, bin gespannt auf Ideen und Umsetzungsvorschläge...
BoolString;