classy i powtarzające sie procedury/funkcje

0

Witam mam taki mały problemik i zastanawiam się, jak to ugryźć, możliwe że ktoś to rozwiązał, a ja jakoś znaleźć nie mogę

 
 TMyClass = class
  private
    FSTR1: string;
    FSTR2: string;
    ...
    FSTRXX: string;

    procedure SetStr1(S: string);
    procedure SetStr2(S: string);
    .....
public
  property STR1: string read FSTR1 write SetSTR1;
  .....
  property STRXX: string read FSTRXX write SetSTRXX;
end;

procedure TMyClass.SetStr1(S: string)
begin
     //to samo dla każdej procedury pomijając że innej zmiennej dotyczy
    if FSTR1 <> S then
      FSTR1 := _ta_sama_funkcja(S); 
     FSTR1 := S;
end;

procedure TMyClass.SetStrXX(S: string)
begin
     //to samo dla każdej procedury pomijając że innej zmiennej dotyczy
    if FSTR1 <> S then
      FSTRXX := _ta_sama_funkcja(S); 
     FSTRXX := S;
end;

Czy da się jakoś to uprościć by nie tworzyć XX procedur
Zwłaszcza że rozchodzi się o jedną w miarę uniwersalną procedurę

Pozdrawiam

0

To może...

Procedure Set(What, Value: String);

A potem:

Procedure Set(What, Value: String);
Begin
 What := LowerCase(What);
 if What = 'str1' Then
 Begin
  if fStr1 <> Value Then
   fStr1 := _ta_sama_funkcja(Value) Else
   fStr1 := Value;
 End;
End;

Taki sposób mi wpadł...

0

Czy da się jakoś to uprościć by nie tworzyć XX procedur
da się, poprzez nietworzenie XX pól w klasie, tylko jednej tablicy. to jest przyczyna twojego "problemu".

0

prawie ale właśnie dzięki tobie już będzie lepiej

 
 type FSTR = (FS1, FS2, FS3, ..., FSX);

Procedure Set(What: FSTR, Value: String);
Begin
 case What of
    FS1: Begin
       if fStr1 <> Value Then
           fStr1 := _ta_sama_funkcja(Value) Else
           fStr1 := Value;
    End;
  End;
End;

przy czym bardziej myslałem o czymś

 
var
   FSET1 : procedure uniwersalna_set();

 procedure uniwersalna_set()
begin
   ustawiam FStr1 ponieważ nazwa_procedury_jest FSET1
end;
0
Azarien napisał(a)

Czy da się jakoś to uprościć by nie tworzyć XX procedur
da się, poprzez nietworzenie XX pól w klasie, tylko jednej tablicy. to jest przyczyna twojego "problemu".

OK ale każde pole dotyczy czegoś innego i mimo wszystko nie można ich potraktować ich jako tablicy przy czym każde pole musi spełniać ogólne założenie

0
TMyClass = class
private
  FSTR: array of string;
 
  procedure SetStr(const Index: Integer; const S: string);
  function GetStr(const Index: Integer): string;
public
  constructor Create;
  destructor Destroy; override;

  property STR1: string index 0 read GetSTR write SetSTR;
  property STR2: string index 1 read GetSTR write SetSTR;
  .....
  property STRXX: string index XX read GetSTR write SetSTR;
end;

constructor TMyClass.Create;
begin
  SetLength(FStr, XX);
end;

destructro TMyClass.Destroy;
begin
  SetLength(FStr, 0);
  inherited;
end;
 
procedure TMyClass.SetStr(const Index: Integer; const S: string);
begin
    if Not SamText(S, FStr[Index]) then
      FStr[Index] := _ta_sama_funkcja(S); 
end;
 
function TMyClass.GetStr(const Index: Integer): string;
begin
  Result := FStr[Index];
end;
0

I to jest to - i oczywiście można to ująć w tablicy :) zwracam honor
szersze i lepsze spojrzenie
Dzięki

0

dodałbym jeszcze taki wiersz w sekcji public do wersji od "misiek":
property STR[Index:Integer]:string read GetSTR write SetSTR;default;

wtedy użycie:

var mc:TMyClass;
var str:String;

mc:=TMyClass.Create;
str:=mc[0]; // zamiast str:=mc.Str1;
mc[0]:=str; // zamiast mc.Str1:=str;

Oraz sugeruję zmianę w procedurze TMyClass.SetStr() na:

procedure TMyClass.SetStr(const Index: Integer;S: string);
begin
  S:=_ta_sama_funkcja(S);
  if S<>FStr[Index] then FStr[Index]:=S;
end;

Z tym że kryształowa kula wskazuje że potrzebujesz:

TStrKind=(sk1,sk2,...,skXX);

TMyClass=class
private
  FStr:array[TStrKind] of String;
protected
  procedure SetStr(Index:TStrKind;S:String);
  function GetStr(Index:TStrKind):String;
public
  property Items[Index:TStrKind]:String read GetStr write SetStr;default;
end;
 
procedure TMyClass.SetStr(Index:TStrKind;S:String);
begin
   S:=_ta_sama_funkcja(S);
   if FStr[Index]<>S then FStr[Index]:=S;
end;
 
function TMyClass.GetStr(Index:TStrKind):String;
begin
  Result:=FStr[Index];
end;

// użycie:
var mc:TMyClass;
var str:String;

mc:=TMyClass.Create;
str:=mc[sk1];
mc[sk1]:=str;
0

I kryształowa kula się nie myli
to jest to co najbardziej potrzebuję - zaczynam przygodę z Delphi i jeszcze nie znam wielu rzeczy - aczkolwiek wiele mi się wyjaśniło

1 użytkowników online, w tym zalogowanych: 0, gości: 1