classy i powtarzające sie procedury/funkcje

Odpowiedz Nowy wątek
2011-07-07 09:44
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

Pozostało 580 znaków

2011-07-07 10:01
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ł...


Pozostało 580 znaków

2011-07-07 10:26
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".

Pozostało 580 znaków

2011-07-07 10:28
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;

Pozostało 580 znaków

2011-07-07 10:32
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

Pozostało 580 znaków

2011-07-07 10:59
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;

- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
fajne, ale potrzebne ci te consty? to nie znaczy tego samego co w C++... - Azarien 2011-07-08 22:44
nie mam pojęcia co oznacza const w c++, potrzebne/niepotrzebne - kwestia gustu, przejrzystości kodu i przyzwyczajenia. No i tak jest ciut szybciej :p - Misiekd 2011-07-09 11:32

Pozostało 580 znaków

2011-07-07 11:25
0

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

Pozostało 580 znaków

2011-07-07 11:27
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;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 4x, ostatnio: _13th_Dragon, 2011-07-07 11:39

Pozostało 580 znaków

2011-07-07 12:55
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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