Problem z właściwością HEIGHT własnego komponentu

Odpowiedz Nowy wątek
2006-12-02 15:20
0

Cześć, mam własny komponent o nazwie TLine. Reprezentuje on po prostu linię:
poziomą(LineType = ltHorizontal), pionową(LineType = ltVertical) i złożoną z kilku punktów(LineType = ltNone)

Jeśli linia jest horyzontalna to problemu nie ma. Pojawia się, gdy zmieniam na linię pionową.
W design time wszystko jest w porządku - teoretycznie.
Ponieważ, gdy zamknę projekt i uruchomię go ponownie, wtedy właściwość HEIGHT przyjmuje wartość 1 i zamiast linii pionowej widać tylko piksel.

Gdy uruchamiam program też widać tylko piksel(muszę zmieniać height w kodem).

W czym może tkwić błąd?

W konstruktorze komponentu nie ma znaczenia, czy przypisuję coś do height, czy nie.
Aha, komponent pochodzi od TGraphicControl.

Pomóżcie, bo ja już umieram :/

Pozostało 580 znaków

2006-12-02 15:26
0

Eee... zapodaj fragmentem kodu, bo nie wiem w którą stronę myśleć


<span style="color: blue">"Kolarstwo to jedna z najtrudniejszych dyscyplin sportu. Nawet najgorszy kolarz jest wciąż wybitnym sportowcem."
s.p. Marco Pantani
</span>

Pozostało 580 znaków

2006-12-02 23:09
0

Cześć, mam własny komponent o nazwie TLine. Reprezentuje on po prostu linię:
poziomą(LineType = ltHorizontal), pionową(LineType = ltVertical) i złożoną z kilku punktów(LineType = ltNone)

Jeśli linia jest horyzontalna to problemu nie ma. Pojawia się, gdy zmieniam na linię pionową.
W design time wszystko jest w porządku - teoretycznie.
Ponieważ, gdy zamknę projekt i uruchomię go ponownie, wtedy właściwość HEIGHT przyjmuje wartość 1 i zamiast linii pionowej widać tylko piksel.
No i tutaj sam nie wiem ale moze to: Jak nie napsiales deklaracji Height dla Object Inspectora (inspektora obietkow) F11. W konstruktorze powinienes (ale wlasnie nie wiem czy knostruktor wykonuje On Create dla komponentu czy tylko jak bedzie sie otwierac w projekcie ja mysle ze to pierwsze wiec)
Trzeba jak dal mnei stworzyc funckje update; w ktorej bedzie
if pionowa_linia then komponent.height := w zalezonsci od dlugosci lini * jakas stala;

TGraphicControl = class(TControl)
private
FCanvas: TCanvas;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
protected
procedure Paint; virtual;
property Canvas: TCanvas read FCanvas;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;

to ta deklaracja ja nie widze tutaj zadnego height przynajmniej nie widze tego co ty masz. Ja bym to nazwal wtedy slepym komponentem dlatego ze on istnieje tylko w pamieci, komputera to jak by zajarac gibona i miec mysli, ktorych nie ma jak sie nie zapali. komponetu nie widac, dodatkowo klasa TControl jakby nie zadzialaly moje porady ze stworzeniem hieghta, powinienes jeszcze pomyslec jak jzu tego nie zrobiles to z TControl mozna jeszcze wykombinowac cos takiego TControl(sender).height := 3; sender to obiekt, do ktorego sie odwolujesz, jako ze twoj komponent juz jest obiektem trzeba to jakos obejsc z tym sender nie pamietam jak :F moze cos to pomoze ale watpie

Pozostało 580 znaków

2006-12-03 14:03
0

OK, wykryłem błąd, ale nie mam za bardzo pomysłu co zrobić, żeby go poprawić.
Otóż w którymś momencie wywołuje się metoda SetLineDirection, która zmiena orientację linii:

procedure TLine.SetLineDirection(ADirection: TLineDirection);
var
 w: integer;
begin
  if FLineDirection<>ADirection then
  begin
    if(ADirection = ldNone) and (csDesigning in ComponentState) then
    begin
      application.MessageBox('Cannot change property LineDirection to ldNone at design time', '', mb_OK+mb_IconStop);
      exit;
    end;

{    w:=width;
    width:=height;
    height:=w;}

    FLineDirection:=ADirection;
    Invalidate;
  end;
end;

Jeśli odkomentarzuję ten kawałek, wtedy błąd się pojawia.
Ale teraz jest kolejny problem.
Otóż chodzi o to, że przy zmianie orientacji linii(z poziomej na pionową, lub na odwrót), ma się zamienić wysokość z szerokością. Dlaczego, to chyba jasne ;)
No i teraz się nie zmienia i nie mam pojęcia jak to obejść.

Pozostało 580 znaków

2006-12-03 23:23
dj
0

Przy przypisaniu nowych wartości do width i height wykonywanych jest kilka niejawnych operacji łącznie z przerysowaniem.

To co jest zakomentowane przerzuć za FLineDerection:= ...;

i raczej wywołanie Invalidate nie jest potrzebne; Przy zmianie rozmiaru okno jest automatycznie przerysowywane. Bo chyba to miało robić Invalidate

PS.

Jeżeli nie pomoże to się odezwij jakoś


Great spirits have always encountered violent opposition from mediocre minds.

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