funkcja - Ikona :)

0

Witam!

Prawdopodobnie poblem, który tu poruszam znalazł się już na forum ale nie mogę znaleźć nic sensownego. Chciałbym napisać funkcję w stylu:

function Ikona(Kolor: TColor): TIcon;
var
  i: TIcon;
  p: TPicture;
begin
  i:= TIcon.Create;
  p:= TPicture.Create;
  p.Bitmap.Canvas.Font.Color:= Kolor;
  p.Bitmap.Canvas.TextOut(0,0, 'A');
  i:= p.Icon;
  Result:= i;
  p.Free;
  i.Free;
end;

tyle, że powyższy kod nic nie robi. Chodzi mi oto aby po podaniu koloru powstała ikona w której będzie literka 'A' o wybranym kolorze.

Jeżeli ktoś potrafi to niech pomoże.
Dzięki.

0

Dam tylko małą wskazówkę, napisz sobie sam :) Najpierw przypisujesz wskazanie na utworzony obiekt do wyniku funkcji, a następnie zwalniasz ten obiekt, a więc wskazanie zwrócone przez funkcję jest nieprawidłowe (w przypadku wskaźników byłby to wiszący wskaźnik), a próba odwołania się do jakiejkolwiek z metod obiektu TIcon poprzez zwrócony wskaźnik skończy się błędem Access Violation.

0

miałem podobny problem ale na nic innego nie wpadłem i zrobiłem w ten sposób:

procedure Ikona(Kolor: TColor;var i:TIcon);
var
  p: TPicture;
begin
  p:= TPicture.Create;
  p.Bitmap.Canvas.Font.Color:= Kolor;
  p.Bitmap.Canvas.TextOut(0,0, 'A');
  i:= p.Icon;
  p.Free;
end;
0

Witam!

Prawdopodobnie poblem, który tu poruszam znalazł się już na forum ale nie mogę znaleźć nic sensownego. Chciałbym napisać funkcję w stylu:

function Ikona(Kolor: TColor): TIcon;
var
  i: TIcon;
  p: TPicture;
begin
  i:= TIcon.Create;
  p:= TPicture.Create;
  try
    p.Bitmap.Canvas.Font.Color:= Kolor;
    p.Bitmap.Canvas.TextOut(0,0, 'A');
    i:= p.Icon;
    Result:= i;
  finally
    p.Free;
  end;
end;

Zwraca chyba ładnie (jak zwyklę piszę z głowy :) ), tylko potem trzeba ręcznie zwolnić obiekt, np.

var
  I: TIcon;
begin
  I := Ikona(clBlack);
  //...
  I.Free;

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