Nietypowa forma

0

Jak zrobić aby przy tworzeniu dynamicznie formy posłać ją na koniec czyli coś w style SendToBack tylko to nie działa.

0

A jak to probujesz zrobic, ze nie dziala?

0
adydan napisał(a)

Ustaw właściwości pozostałych form na StayOnTop wówczas powinny być nad nową formą :)

jak masz tak podpowiadać to lepiej zamilcz!

Jak Ci SendToBack nie działa to masz http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx z flagą HWND_BOTTOM

0

Dzięki, jakoś zadziałało ;)

Głowie się jedną sprawą. Jak zmienić kolor background Memo na jakiś inny aby zapisać najlepiej w formie szesnastkowym, np. FF0000

0

Nie wiem czy chodzi Ci o takie rozwiązanie jak poniżej, ale kolor w Hex możesz zamienić na TColor tak:

function HexToRGB(Hex: string): TColor;
var
  I : integer;
  R, G, B : Byte;
begin
  Result := 0;
  if Length(Hex) <> 6 then
    Exit;
  for I := 1 to Length(Hex) do
  begin
    if not (UpCase(Hex[I]) in ['0'..'9', 'A'..'F']) then
      Exit;
  end;
  R := StrToInt('$' + Copy(Hex, 1, 2));
  G := StrToInt('$' + Copy(Hex, 3, 2));
  B := StrToInt('$' + Copy(Hex, 5, 2));
  Result := RGB(R, G, B);
end;

I później w kodzie:

  Memo1.Color := HexToRGB('FF0000');
0

Nie sprawdzałem, ale nie da się:

Memo.Color:=$FF0000;

??

0

A faktycznie się tak da, mam za dużo zaufania do pytających, myślałem że skoro pyta to próbował sam w
taki sposób jak pisze Juhas, ale nie działało, dlatego pyta. Trzeba brać poprawkę na brak kombinowania :P

0

Działa. Extra! Jesteście wielcy.

Mam problem jednak bo to utworzone okno dynamicznie nie jest rozłączne ponieważ jeśli dla potomka dam SendToBack to uciekają mi wszystkie a ja chcę tylko te które są utworzone na podstawie formy przykład. Jak to zrobić?

0
PjakPawel napisał(a)

jeśli dla potomka dam SendToBack to uciekają mi wszystkie a ja chcę tylko te które są utworzone na podstawie formy przykład. Jak to zrobić?

Coś tu chyba kręcisz. Jeśli dla okna RODZICA dałbyś komendę, to faktycznie mogłoby się tak stać. Ale dla okna potomka?

0

No mam Form1 w której tworzę formę dynamicznie do tablicy także dynamicznej.

Forma= TForm2.Create(nil);
          Forma.Visible:= True;
          Forma.BorderStyle:=bsNone;
          Forma.SendToBack;

Dynamicznie forma tworzona jest na podstawie formy Form2 (czyli nie głównej).

Dodatkowo zapytam jak z głównej formy kasować znaczy zamykać te utworzone?

Bo jeśli dam np. Forma[id].Close; to wywala mi błąd.

0
PjakPawel napisał(a)

No mam Form1 w której tworzę formę dynamicznie do tablicy także dynamicznej.

Forma= TForm2.Create(nil);
          Forma.Visible:= True;
          Forma.BorderStyle:=bsNone;
          Forma.SendToBack;

Dynamicznie forma tworzona jest na podstawie formy Form2 (czyli nie głównej).

Dodatkowo zapytam jak z głównej formy kasować znaczy zamykać te utworzone?

Bo jeśli dam np. Forma[id].Close; to wywala mi błąd.

A co ma nie wywalać, jak Forma to zmienna typu TForm? Przynajmniej tak wynika z Twojego kodu.
Możesz to zrobić na kilka sposób. M.in. za pomocą komunikatów Windows(konkretnie WM_CLOSE) - wtedy musisz znać handle formy. Handle form możesz sobie trzymać np. w jakiejś tablicy. Inną metodą jest trzymanie całych referencji w tablicy. Czyli tworzysz sobie tablicę np:

var
  MyForms: array of TForm;

a potem tworzysz formy:

  MyForms[i]:=TJakasForma.Create(Application);

Drugi sposób jest o tyle lepszy, że możesz się przez tablicę odwoływać do jakiejkolwiek metody, czy właściwości utworzonych form, ale pamiętaj o rzutowaniu, czyli:

  MyForms[i].Close; //źle
  TJakasForma(MyForms[i]).Close; //dobrze
  (MyForms[i] as TJakasForma).Close; //dobrze

Dodatkowo pamiętaj, że tak zamknięta forma nie jest zwalniana z pamięci. Aby ją zwolnić, musisz jeszcze wywołać metodę Free, lub w onClose formy zamykanej, dać instrukcję:

  action:=caFree;

Aby posłużyć się drugą opcją, najłatwiej będzie, jeśli stworzysz sobie jakąś formę bazową z oprogramowanym tym zdarzeniem, a potem będziesz kolejne formy tworzone dynamicznie z niej dziedziczył. Jest to o tyle dobre, że nie musisz oprogramowywać zdarzenia w każdej formie, tylko w tej jednej bazowej. Masz to?

0

Tak mam zrobioną formę bazową.

Zrobiłem kod i przy kompilacji wywala mi błąd w linijce:

Formss[k]:=TForm2.Create(Application);
0
PjakPawel napisał(a)

Tak mam zrobioną formę bazową.

Zrobiłem kod i przy kompilacji wywala mi błąd w linijce:

Formss[k]:=TForm2.Create(Application);

Damn, może nie wyglądam, ale nie jestem jasnowidzem. Jaki błąd???

0

Project project1.exe raised exception class EAccessViolation with message 'Access violation at address 0049D003 in module 'project1.exe'. Write of address 00000000'. Process stopped. Use Step or Run to continue.

Formy się tworzą w tablicy a ilość ich to ilość wierszy w StringGrid. Wcześniejszy kod działał z tą pętlą a ten nie za bardzo.

0

Zanim użyjesz tablicy dynamicznej musisz jej nadać rozmiar (SetLength).

0

No ale jaki jej nadać skoro będę wiedział dopiero ja for to do przeleci mi cały StringGrid?

0

Ok, mam już to za sobą. Niestety ale nie mam pojęcia jak tworzyć komponenty, które są na tej formie jako przykład, a raczej jak się do nich odwoływać (Memo, Label, PopupMenu).

0

Hello. Już praktycznie skończone lecz pozostaje mi jeden błąd. Funkcje ładowania do tablicy mam podpiętą do buttona (funkcje znaczy nadanie rozmiaru, tworzenie itp). Nawet jak nie nacisnę na button czyli nic nie właduje do tablicy wywala mi błąd:
EStackOverflow

var
Formss: array of TForm2;


{...}

var
s:Integer;
begin
SetLength(Formss, sgNotatka.RowCount);

  for s:=1 to StringGrid1.RowCount-1 do
        begin
          Formss[s]:=TForm2.Create(Application);
          Formss[s].Visible:=True;
          Formss[s].Memo1.Text:=sgNotatka.Cells[1,s];
        end;  

Nie wiem czy dobrze ten kod powyżej. Przy tworzeniu jest OK. Zamykanie tych form utworzonych mam za pomocą Close bo Free lub inne wywalają taki sam błąd jak główne te: EStackOverflow. Jak wykonać czyszczenie czy może źle nadaje rozmiar.

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