![]() |
Delphi-Version: XE2
Array durch Objectlist ersetzen
Hallo,
ich stehe vor einem Problem. Ich habe die Aufgabe bekommen mein Array durch eine TObjectlist zu ersetzten. Nun habe ich mich ein bisschen damit beschäftigt und viel im Inet gelesen, aber ich habe immer noch keinen Plan was ich machen soll.
Delphi-Quellcode:
Wäre echt nett, wenn Ihr mir helfen könntet. Sitze an dieser Aufgabe nämlich nicht alleine fest :/
unit Woerter;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Contnrs; type TWoerterZaehlen = class(TObjectlist) // Wort: String; // Anzahl: integer; protected Fwort: string; Fanzahl: integer; public type ArrofTWoerterZaehlen = array of TWoerterZaehlen; function HaeufigkeitDerWorte2(st_w1: tstringlist): ArrofTWoerterZaehlen; constructor create(Anz: integer; Wor: String); overload; constructor create(Wor: String); overload; property Wort: String read Fwort write Fwort; property Anzahl: integer read Fanzahl write Fanzahl; function toString(arrofsort: TWoerterZaehlen.ArrofTWoerterZaehlen): String; end; implementation function TWoerterZaehlen.HaeufigkeitDerWorte2(st_w1: tstringlist) : TWoerterZaehlen.ArrofTWoerterZaehlen; var i: integer; a: integer; s_wort: string; b_iv: boolean; index: integer; Begin setlength(result, 0); index := 0; for i := 0 to st_w1.count - 1 do begin b_iv := false; s_wort := AnsiLowerCase(st_w1[i]); for a := 0 to length(result) - 1 do begin if result[a].Fwort = s_wort then begin b_iv := true; index := a; break; end; end; if b_iv then begin result[index].Fanzahl := result[index].Fanzahl + 1; end else begin setlength(result, length(result) + 1); result[high(result)] := TWoerterZaehlen.create(s_wort); end; end; end; { TWoerterZaehlen } constructor TWoerterZaehlen.create(Anz: integer; Wor: string); begin Anzahl := Anz; Wort := Wor; end; constructor TWoerterZaehlen.create(Wor: String); begin Anzahl := 1; Wort := Wor; end; function TWoerterZaehlen.toString(arrofsort: ArrofTWoerterZaehlen): String; begin result := ''; end; end. Gruß Philipp |
AW: Array durch Objectlist ersetzen
Hallo,
Zitat:
Zitat:
Und Vorbeugend auf deine weiteren Fragen: Ist der von dir gepostete Quelltext das Original oder von dir schon bearbeitet? Grüße |
AW: Array durch Objectlist ersetzen
WoerterZahlen ist schon eine TObjectlist, die ein Array enthält, das zu einer TObjectlist umgeschrieben werden soll? Der Sinn erschließt sich mir gerade nicht so recht :gruebel:
|
AW: Array durch Objectlist ersetzen
Ok. Werde ich dann machen, danke.
Das ist der original Quelltext und ich habe bei der Klasse schon leicht angefangen, aber dann wusste ich nicht mehr weiter.. :/
Delphi-Quellcode:
Dort habe ich schon TObjectlist eingetrage. Sorry, habe ich vergessen zu sagen
type
TWoerterZaehlen = class(TObjectlist) // Wort: String; // Anzahl: integer; |
AW: Array durch Objectlist ersetzen
Nehmen wir mal an, die Ursprungsklasse sah etwa so aus:
Delphi-Quellcode:
Dann muss man doch "nur" das Array durch die geforderte TObjectlist ersetzen.
type
TDings = class private FSubObjects: array of TDings; ... end;
Delphi-Quellcode:
Allerdings darf man nicht vergessen, diese Instanz nun auch zu erzeugen (z.B. im Konstruktor) und später wieder freizugeben (z.B. im Destruktor).
type
TDings = class private FSubObjects: TObjectlist; ... end; [edit] Außerdem fallen SetLength()- und ähnliche Aufrufe weg, dafür muss man nun die Methoden der TObjectlist benutzen (Add etc.). [/edit] |
AW: Array durch Objectlist ersetzen
Hey;
Arbeite an der gleichen Aufgabe wie Dyami; problem ist bei unserem Quell text, ist die Kontrolle, ob ein string in der Tobjectlist vorhanden ist. per
Delphi-Quellcode:
kommt ne Meldung; inkompatible Typen.
result.IndexOf () // result = Twoerterzaehlen = class(TObjectlist)
Klar, String und Tobject. aber wie könnte man dieses Problem lösen ? zu erst war die idee jedesmal .create versucht mal ein index zurück zugeben, wenn der im Speicher immer wieder eine neue Position bekommt ... die If abfrage würde also nie im Fall treten. Was wollen wir den überhaupt erreichen ? Wir haben ein Memo.text -> wird als commatext in eine Stringlist übergeben -> diese Stringlist wird an die Methode übergeben -> Durlaufen mit verschachtelter FOR schleife die Liste -> möchten KOntrollieren ob der String in der TObjectlist vorhanden ist -> WENN JA Zähle den INDEX ein Hoch WENN NEIN Füge das WOrt hinzu & Zähle die Häufigkeit der Wörter ein hoch. so .... wie kann man solches am besten anstellen ?!
Delphi-Quellcode:
i_idx := 0;
result := Twoerterzaehlen.created(0, ''); // *^1 // Durchlaufen der Wortlist for i := 0 to st_woerter.count - 1 do begin b_vorhanden := false; s_ewort := AnsiLowerCase(st_woerter[i]); // Prüfen, ob Wort da for a := 0 to result.count - 1 do begin if result.Items[a] = s_ewort then // falsch begin i_idx := result.IndexOf((Twoerterzaehlen.create(s_ewort))); // geändert werden b_vorhanden := TRUE; break; end; end; // wenn ja, dann hochzählen if b_vorhanden then begin // inc(result[i_idx]); end else // Sonst ergänzen begin result.Add(Twoerterzaehlen.created(1, s_ewort)); end; end; end;
Delphi-Quellcode:
// *^1
constructor Twoerterzaehlen.created(Anz: integer; Wor: String); begin Anzahl := Anz; Wort := Wor; end; Siehe oben; methode zur Häufigkeit der Wörter wieder geben. bei weitere Fragen bitte melden ; Danke für jede kleine Hilfe .... |
AW: Array durch Objectlist ersetzen
Da schreibt man sich flugs eine einfache billige Methode/Routine und ruft die auf.
Delphi-Quellcode:
Die List wird sequentiell durchlaufen und die enthaltenen Objekte daraufhin untersucht, ob deren Stringfeld mit dem Suchstring übereinstimmt. Wenn ja, wird der Index des ersten passenden Objekts zurückgegeben und die Schleife abgebrochen. Entspricht kein Objekt den Kriterien, ist der Rückgabewert -1 (am Anfang der Funktion festgelegt).
function IndexOfString(List: TObjectList; const SearchStr: string): integer;
var i: integer; Obj: TDeinObject; begin Result := -1; for i := 0 to List.Count - 1 do begin Obj := List[i] as TDeinObject; if Obj.Stringfeld = SearchStr then begin Result := i; break; end; end; end; |
AW: Array durch Objectlist ersetzen
Scheint eine SEHR doofe Frage sein;
aber : Zitat:
Delphi-Quellcode:
ansilower, damit er groß klein ignoriert;
s_ewort := AnsiLowerCase(st_woerter[i]) as Twoerterzaehlen;
und as Twoerterzaehlen : Class; reicht ihm das nicht als Object zu speichern ? vielleicht merk man dass ich noch nieee im Tobjectlist gearbeitet habe. sry :< |
AW: Array durch Objectlist ersetzen
Du hast doch eine TObjectList. Diese enthält Objekte von einem bestimmten Typ, den ich nicht kenne, daher habe ich die Klasse im Beispiel einfach TDeinObject genannt. Dieses Objekt enthält ja nach Deiner Aussage auch eine Eigenschaft vom Typ String, die es zu untersuchen gilt. Das heißt im Beispiel dann eben Stringfeld. Nach Ersetzung dieser meiner Platzhalter sollte das ganze im Wesentlichen schon funktionieren. Statt AnsiLowercase kannst Du übrigens auch die Unit StrUtils einbinden und dann mit AnsiSameText vergleichen.
|
AW: Array durch Objectlist ersetzen
achsö;
alles klar, habs. Dank dir =) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz