| Autor | Správa |
jasug
 Užívateľ
 Založený: 05.09.2008 Príspevky: 47
 |
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; |
|
| |
  |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 936
 |
pri tej mdi aplikacii ostava tform alebo je tam uz iny nazov triedy ? |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 |
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. |
| |
   |
 |
jasug
 Užívateľ
 Založený: 05.09.2008 Príspevky: 47
 | Zaslal: So 09.04.11 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 |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: So 09.04.11 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. |
| |
   |
 |
jasug
 Užívateľ
 Založený: 05.09.2008 Príspevky: 47
 |
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. |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 |
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; |
Unit3
| kó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; |
|
| |
   |
 |
jasug
 Užívateľ
 Založený: 05.09.2008 Príspevky: 47
 | Zaslal: Ne 10.04.11 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. |
|
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Ne 10.04.11 10:31 |   |
Opat mi to funguje ( aj ako klasicky form, aj ako MDI form ). Aku verziu Delphi to pouzivas? |
| |
   |
 |
jasug
 Užívateľ
 Založený: 05.09.2008 Príspevky: 47
 | Zaslal: Ne 10.04.11 12:56 |   |
Na tento testovací program som použil D6 Enterprise. |
| |
  |
 |
|
Nemôžete pridávať nové témy do tohto fóra. 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. Nemôžete hlasovať v tomto fóre.
|
|