Einzelnen Beitrag anzeigen

BoolString

Registriert seit: 2. Feb 2009
Ort: Varel
70 Beiträge
 
RAD-Studio 2009 Pro
 
#1

Grundlegende Frage zur Strukturierung von Records und tList

  Alt 2. Feb 2009, 22:06
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;
  Mit Zitat antworten Zitat