| | |
| Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
Autor | Správa |
---|
Registrovaný: 05.09.08 Prihlásený: 11.11.22 Príspevky: 69 Témy: 37 | Napísal jasug: 09.04.2011 4:46 | |
|
Zdravím,
v menšej aplikácii v D6 kachličkujem pozadie formu, ktorý má FormStyle fsNormal, nižšie uvedenou procedúrou zavesenou na OnPaint . Podobný postup som zvolil aj v aplikácii kde využívam MDI okná, FormStyle formulárov je fsMDIForm a fsMDIChild, uvedená procedúra sa vykoná ale bez výsledku, tzn. že formuláre nie sú vykachličkované. Tento pokus s MDI je prvý a neviem, kde robím chybu alebo ako mám pristupovať k MDI formom. Podľa helpov som našiel iba rozdiel vo vytváraní a zatváraní formov.
Vďaka za informácie a pomoc.
Kód: // ............................................................................ procedure Kresli_pozadie_formu(Sender: TObject);
var x, y: Integer;
begin if (BitMapPozadie.Width > 0) and (BitMapPozadie.Height > 0) then begin y := 0; while y < (Sender as TForm).Height do begin x := 0; while x < (Sender as TForm).Width do begin (Sender as TForm).Canvas.Draw(x, y, BitMapPozadie); x := x + BitMapPozadie.Width; end; y := y + BitMapPozadie.Height; end; end; end;
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 09.04.2011 9:12 | |
|
pri tej mdi aplikacii ostava tform alebo je tam uz iny nazov triedy ?
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 09.04.2011 9:13 | |
|
Nieco musis robit zle, lebo ja som skusil tvoj postup a mne to funguje:
Napis presnejsi postup, ako si to robil pre MDI formulare, ked ti to nevykresluje.
|
|
Registrovaný: 05.09.08 Prihlásený: 11.11.22 Príspevky: 69 Témy: 37 | Napísal autor témy jasug: 09.04.2011 10:30 | |
|
Zdravím,
zasielam unit aplikácie, kde robím kachličkovanie.Ak nastavím FormStyle na fsNormal tak všetko pracuje ako má, ale ak zmením na fsMDIForm, tak vykresli form bez vykachličkovania. A ešte som prišiel na to, že keď dám na form Label tak, mi je nezobrazí ale pri fsNormal áno. Niečo robím zle, ale neviem prísť na to čo a kde. Vďaka Vám.
Kód: unit Kopirovanie_suborov; { Formular Form_vyber_suborov je MDI
}
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TMainForm = class(TForm) btKopiruj: TButton; btVyber_suborov: TButton; btVyber_adresara: TButton; lbxZoznam_suborov: TListBox; Label1: TLabel; btKoniec: TButton; procedure FormCreate(Sender: TObject); procedure btVyber_suborovClick(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure btKoniecClick(Sender: TObject); private { Private declarations } public { Public declarations } end;
procedure Kresli_pozadie_formu(Sender: TObject);
var MainForm: TMainForm; BitMapPozadie: TBitmap; // bitmapa pozadia formulara
implementation
uses Vyber_suborov;
{$R *.DFM}
// ........................................................................ procedure TMainForm.FormCreate(Sender: TObject); var Subor_bmp : String; begin
// urcenie cesty podla umiestnenia exe suboru Subor_bmp := ExtractFilePath(Application.ExeName)+ 'bor6.bmp';
// nacitanie bitmapy pozadie ak je pritomny subor bor6.bmp BitmapPozadie := TBitmap.Create; if FileExists(Subor_bmp) then begin BitmapPozadie.LoadFromFile(Subor_bmp); end else Application.MessageBox(PChar('Neexistuje súbor ' + Subor_bmp + ' '), 'Neprítomný súbor !! ', mb_OK); end;
// ........................................................................... procedure TMainForm.btVyber_suborovClick(Sender: TObject); begin if Form_vyber_suborov = nil then Form_vyber_suborov:=TForm_vyber_suborov.Create(self);
with Form_vyber_suborov do begin Left:=MainForm.Left + 30; Top:=MainForm.Top - 165; Height:= 300; Width := 580; Show; end;
end;
// ............................................................................ procedure Kresli_pozadie_formu(Sender: TObject);
var x, y: Integer;
begin if (BitMapPozadie.Width > 0) and (BitMapPozadie.Height > 0) then begin y := 0; while y < (Sender as TForm).Height do begin x := 0; while x < (Sender as TForm).Width do begin (Sender as TForm).Canvas.Draw(x, y, BitMapPozadie); x := x + BitMapPozadie.Width; end; y := y + BitMapPozadie.Height; end; end; end;
// ......................................................................... procedure TMainForm.FormPaint(Sender: TObject); begin Kresli_pozadie_formu(Sender); end;
// ......................................................................... procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); begin BitmapPozadie.Free; end;
// ........................................................................... procedure TMainForm.btKoniecClick(Sender: TObject); begin Close; end;
end.
// Kod patri do [code]! Ďuri
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 09.04.2011 11:27 | |
|
Mne to opat ide vsetko spravne, aj pre fsNormal aj pre fsMDIForm. Pridal som na from vsetky ovladacie prvky, pomenil niektore nazvy aby to slo skompilovat a vsetko sa vykresli. Skusal som to v Delphi 7, tak neviem, ci to ma nejaky dopad. Skus si vytvorit novy projekt a v nom sprav iba jednu jedinu funkciu na to kreslenie a v nej skus, ci to pojde. Ak nie, tak s tym asi nic nespravis. Ak pojde, tak chyba bude niekde v tvojom postupe.
|
|
Registrovaný: 05.09.08 Prihlásený: 11.11.22 Príspevky: 69 Témy: 37 | Napísal autor témy jasug: 10.04.2011 9:27 | |
|
Vďaka za Váš čas, pôvodnú aplikáciu som vytvoril v D5 a tak som aj MDI robil v D5, dal som to D6 a už to pracuje ako má. Ale mal by som otázku : potreboval by som v aplikácii kde je jeden MDIForm a štyri dcérske MDIChildFormy aktualizovať komponenty v dcérskych formoch po nejakej udalosti, napr. v MDIChildForm2 vznikne OnClick na btButton2 a v tejto metóde chcem zmeniť Label3.Caption na MDICHildForm3. Zatiaľ sa mi to vôbec nedarí, stačí mi kopnutie ako na to. Vďaka.
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 10.04.2011 9:57 | |
|
Staci pripojit unit, v ktorom je deklarovany form, s ktorym chces pracovat a potom pristupujes normalne k jeho clesnkym datam. Priklad: Sme v unit2 ( form2 - child form ) a chceme zmenit text vo form3, takisto je child. Potom treba pridat do uses Unit3, lebo tam je deklarovana trieda TForm3. Ale pozor, nepridavaj ho do uses v interface ale do uses v implementation, pretoze keby si pridal aj v unite3 unit2, neskompilovalo by to, lebo takto vznikol cyklicky odkaz. Takze ukazka:
Unit2
Kód: implementation
{$R *.dfm}
uses Unit3;
procedure TForm2.Button1Click(Sender: TObject); begin
// zmeni text vo Form3, ktory ma formStyle fsMDIChild Form3.Label1.Caption := 'Zmena textu';
end; Unit3Kód: implementation
{$R *.dfm}
uses Unit2;
procedure TForm3.Button1Click(Sender: TObject); begin
// zmeni text vo Form2, ktory ma formStyle fsMDIChild Form2.Label1.Caption := 'zmena textu';
end;
|
|
Registrovaný: 05.09.08 Prihlásený: 11.11.22 Príspevky: 69 Témy: 37 | Napísal autor témy jasug: 10.04.2011 10:21 | |
|
Zdravím,
myslím že to robím podobne, ibaže mne to nefunguje.
Uvádzam testovací kód, ktorý mi nefunguje tzn. po OnClick neprepíše Label1.Caption.
Vďaka.
Kód: unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TMainForm = class(TForm) Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var MainForm: TMainForm;
implementation
uses Unit2;
{$R *.dfm}
procedure TMainForm.Button1Click(Sender: TObject); begin if Form2 = nil then Form2:=TForm2.Create(self);
with Form2 do begin Left:=MainForm.Left + 60; Top:=MainForm.Top - 145; Height:= 300; Width := 580; Show; end;
end;
end.
unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm2 = class(TForm) Button1: TButton; Button2: TButton; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end;
procedure TForm2.Button1Click(Sender: TObject); begin MainForm.Label1.Visible := true; MainForm.Label1.Caption :='visible'; end;
procedure TForm2.Button2Click(Sender: TObject); begin // MainForm.Label1.Visible := false; MainForm.Label1.Caption :='unvisible' end;
procedure TForm2.FormDestroy(Sender: TObject); begin Form2 := nil; end;
end.
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 10.04.2011 10:31 | |
|
Opat mi to funguje ( aj ako klasicky form, aj ako MDI form ). Aku verziu Delphi to pouzivas?
|
|
Registrovaný: 05.09.08 Prihlásený: 11.11.22 Príspevky: 69 Témy: 37 | Napísal autor témy jasug: 10.04.2011 12:56 | |
|
Na tento testovací program som použil D6 Enterprise.
|
|
| Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|