AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Probleme mit eigener Klasse

Ein Thema von Luckie · begonnen am 28. Feb 2003 · letzter Beitrag vom 21. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
35.147 Beiträge
 
Delphi 2006 Professional
 
#1

Probleme mit eigener Klasse

  Alt 28. Feb 2003, 20:20
Ich habe mir eine eigene Klasse entworfen um einen String der durch Separatoren getrennt ist in einzelne Strings zu zerlegen.
Delphi-Quellcode:
type TSplitString = class
 private
   FString2Split : String;
   FSepChar : Char;
   FStrings : TSplitStrArray;
   FStringsCount : Integer;
   FSepPos : array of Integer;
   procedure SetSplitString(SplitStr: String);
   procedure SetSepChar(sep: Char);
   procedure SetSepPos;
   procedure SplitString;
 public
   constructor create(SplitStr: String; sep: Char);
   property String2Split: String read FString2Split write SetSplitString;
   property SepChar: Char read FSepChar write SetSepChar;
   function StringsCount: Integer;
   property SplitStringEx: TSplitStrArray read FStrings write SplitString; { hier kommt die Meldung: "Inkompatible Typen" }
end;

constructor TSplitString.create(SplitStr: String; sep: Char);
var
  i : Integer;
begin
  FStringsCount := 0;
  SetSplitString(SplitStr);
  SetSepChar(sep);
  if SplitStr[length(SplitStr)] <> sep then
    SplitStr := SplitStr+sep;
  for i := 1 to length(SplitStr)-1 do
  begin
    if SplitStr[i] = sep then Inc(FStringsCount);
  end;
  SetSepPos;
end;

procedure TSplitString.SetSepPos;
var
  i, j : Integer;
begin
  j := 0;
  setlength(FSepPos, FStringsCount+1);
  FSepPos[0] := 0;
  for i := 1 to length(FString2Split)-1 do
  begin
    if FString2Split[i] = FSepChar then
    begin
      FSepPos[j+1] := i;
      Inc(j);
    end;
  end;
end;

procedure TSplitString.SetSplitString(SplitStr: String);
begin
  if SplitStr = 'then
    Messagebox(0, 'Die Zeichenfolge ist leer.', 'Hinweis - TSplitString', MB_ICONINFORMATION);
  FString2Split := SplitStr;
end;

procedure TSplitString.SetSepChar(sep: Char);
begin
  if sep = 'then
    Messagebox(0, 'Das Trennzeichen ist leer.', 'Hinweis - TSpliString', MB_ICONINFORMATION);
  FSepChar := sep;
end;

function TSplitString.StringsCount: Integer;
begin
  result := FStringsCount;
end;

procedure TSplitString.SplitString;
var
  i : Integer;
begin
  setlength(FStrings, FStringsCount);
  for i := 0 to FStringsCount-1 do
  begin
    FStrings[i] := copy(FString2Split, FSepPos[i], FsepPos[i+1]-FSepPos[i]);
  end;
end;
An der besagten Stelle kommt eben diese Fehlermeldung.
property SplitStringEx: TSplitStrArray read FStrings write SplitString; Soll zum einen das Array mit den aufgeteilten Strings zurückgeben und zum anderen es füllen. Aber irgendwie mache ich da was falsch.
Verbesserungsvorschläge und Vereinfachungen der Klasse sind auch herzlich willkommen.
Michael
"Every language has an optimization operator. In Delphi that operator is: //"
  Mit Zitat antworten Zitat
Snoop007

Registriert seit: 14. Jan 2003
331 Beiträge
 
Delphi 6 Personal
 
#2
  Alt 28. Feb 2003, 20:32
hi,
Delphi-Quellcode:
   
property String2Split: String read FString2Split write SetSplitString;
   property SepChar: Char read FSepChar write SetSepChar;
   function StringsCount: Integer;
   property SplitStringEx: TSplitStrArray read FStrings write SplitString; { hier kommt die Meldung: "Inkompatible Typen" }
mach mal
Delphi-Quellcode:
function StringsCount: Integer;
   property String2Split: String read FString2Split write SetSplitString;
   property SepChar: Char read FSepChar write SetSepChar;
   property SplitStringEx: TSplitStrArray read FStrings write SplitString; { hier kommt die Meldung: "Inkompatible Typen" }
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
35.147 Beiträge
 
Delphi 2006 Professional
 
#3
  Alt 28. Feb 2003, 20:37
Öhm, was hast du jetzt gemacht außer die Reihenfolge zu ändern? (Was übrigens auch nicht hilft. )
Michael
"Every language has an optimization operator. In Delphi that operator is: //"
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#4
  Alt 28. Feb 2003, 20:40
Die Funktion, die du in Write schreibst, muss, glaube ich, einen Parameter des Typs erhalten, der auch die Property hat.
So ungefähr...

Chris

PS: Ich weiß: ist ziemlich unverständlich!
»Mein Kaffee ist so schwarz — der fängt gleich an zu rappen...«
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
35.147 Beiträge
 
Delphi 2006 Professional
 
#5
  Alt 28. Feb 2003, 20:50
OK, habe es jetzt so geändert:
Delphi-Quellcode:
type
  TSplitStrArray = array of String;

type TSplitString = class
 private
   FString2Split : String;
   FSepChar : Char;
   FStrings : TSplitStrArray;
   FStringsCount : Integer;
   FSepPos : array of Integer;
   procedure SetSplitString(SplitStr: String);
   procedure SetSepChar(sep: Char);
   procedure SetSepPos;
   procedure SplitString(sArray: TSplitStrArray);
 public
   constructor create(SplitStr: String; sep: Char);
   function StringsCount: Integer;
   property String2Split: String read FString2Split write SetSplitString;
   property SepChar: Char read FSepChar write SetSepChar;
   property SplitStringEx: TSplitStrArray read FStrings write SplitString(sArray: TSplitStrArray); { Zeile 192 }
end;
Jetzt sagt er mir in der gleichen Zeile wie oben:
Zitat:
[Fehler] AdressDB.dpr(192): ';' erwartet, aber '(' gefunden
[Fehler] AdressDB.dpr(192): 'END' erwartet, aber ')' gefunden
Bei der ersten Meldung steht der Cursor direkt vor sArray. Beim zweiten vor dem Abschließenden Semikolon.
Michael
"Every language has an optimization operator. In Delphi that operator is: //"
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
35.147 Beiträge
 
Delphi 2006 Professional
 
#6
  Alt 28. Feb 2003, 21:05
OK, OK, OK. Ich habs. Die letzte Zeile muß natürlich so
property SplitStringEx: TSplitStrArray read FStrings write SplitString; heißen.
Michael
"Every language has an optimization operator. In Delphi that operator is: //"
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#7
  Alt 28. Feb 2003, 21:26
Jetzt funktionierts?

Chris
»Mein Kaffee ist so schwarz — der fängt gleich an zu rappen...«
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
35.147 Beiträge
 
Delphi 2006 Professional
 
#8
  Alt 28. Feb 2003, 21:28
Mehr oder weniger. Kompilieren tuit er, er macht nur nicht das, was ich will.
Michael
"Every language has an optimization operator. In Delphi that operator is: //"
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
Ort: Vöhringen (Bayern)
3.361 Beiträge
 
Delphi XE6 Professional
 
#9
  Alt 28. Feb 2003, 21:54
Hier mal eine Nachbildung des Explode-Befehls von PHP. Das dürft wohl in etwa das sein, was du da in deine Klasse einprogrammieren willst.
Delphi-Quellcode:
uses Types;

// Explode trennt S in die durch Separator getrennten Elemente auf. Wenn Limit
// > 0 ist, so werden max. Limit Elemente getrennt, wobei im letzen Element
// die Restzeichenkette steht.
{type
  TStringDynArray = array of string;}


function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray;
var
  SepLen: Integer;
  F, P: PChar;
  ALen, Index: Integer;
begin
  SetLength(Result, 0);
  if (S = '') or (Limit < 0) then Exit;
  if Separator = 'then
  begin
    SetLength(Result, 1);
    Result[0] := S;
    Exit;
  end;
  SepLen := Length(Separator);
  ALen := Limit;
  SetLength(Result, ALen);

  Index := 0;
  P := PChar(S);
  while P^ <> #0 do
  begin
    F := P;
    P := AnsiStrPos(P, PChar(Separator));
    if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F);
    if Index >= ALen then
    begin
      Inc(ALen, 5); // mehrere auf einmal um schneller arbeiten zu können
      SetLength(Result, ALen);
    end;
    SetString(Result[Index], F, P - F);
    Inc(Index);
    if P^ <> #0 then Inc(P, SepLen);
  end;
  if Index < ALen then SetLength(Result, Index); // wirkliche Länge festlegen
end;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
35.147 Beiträge
 
Delphi 2006 Professional
 
#10
  Alt 28. Feb 2003, 21:59
Zitat von jbg:
Hier mal eine Nachbildung des Explode-Befehls von PHP. Das dürft wohl in etwa das sein, was du da in deine Klasse einprogrammieren willst.
Du hast es erfaßt. Und ich werde wohl deinen Code nehmen. Denn mit einer Klasse schießt man damit wohl mit Spatzen auf Kanonen. Trotzdem bleibt mein Wunsch aus dem anderen Topic bestehe, was man verbessern könnte oder ändern sollte. Dient ja auch der Übung.
Michael
"Every language has an optimization operator. In Delphi that operator is: //"
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf