Atribuirea și legarea componentelor la un formular

Atribuirea și legarea componentelor la un formular

Nu știu cum să sun mai corect întrebarea și să merg direct la subiect.
Există un formular cu 3 Timage. 1 este în centrul din stânga, alta este exact în centrul formei, 3 este în centrul din dreapta.
Încarcă imagini dinamic, toate au o proprietate proporțională.
Când se modifică dimensiunea formularului, imaginile se mută din pozițiile lor

Este necesar să se obțină un astfel de efect încât, la schimbarea dimensiunilor componentelor (inclusiv maximizarea), TImage ar economisi
pozițiile relative la forma în proporțiile corecte, + mărirea / micșorarea imaginilor în timpul redimensionării.

Am încercat proprietatea ancorelor
la 1 am pus în adevărat (stânga, bootom, sus)
la 2 - la 1 am pus în adevărat (stânga, bootom, sus, dreapta)
la 3 - pune în adevărat (dreapta, bootom, sus)

dar numai imaginea centrală crește apoi restul nu, proprietatea Constrângeri nu ajută

dacă 2 a fost lăsat și scos din dreapta, atunci 1 și 3 cresc și 2 rămân mici

În general, problema modului de a implementa corect acest lucru

Poate vei posta cateva screenshot-uri? Și este complicat să înțelegi. De exemplu, cu greu îmi imaginez ce "este în centrul din stânga".

panouri - e ca și Timage
de mai jos - Headercontrol

1 formular de ecran în condiții normale
2 în stare întinsă

aici panourile ar trebui să se întindă și să rămână în locurile lor așa cum face headercontrol

Cred că am nevoie de asta, dar în d7 nu este așa

Mi se pare că nu este deloc dificil să aplicăm această logică de comportament prin "mâini", după ce l-am înregistrat în formatorul OnResize.

Joe - deja încercat, buggy după mai multe rizayzov, mai ales după maximizare

Iată codul

i: = Runda (StrToFloat (inttostr (GroupBox13.Width)) / (345/105));
j: = Runda (StrToFloat (inttostr (GroupBox13.Width)) / 43.125);
Image2.Width: = i;
Image3.Width: = i;
Image4.Width: = i;
Image2.Left: = j;
Image3.Left: = j * 2 + i;
Image4.Left: = j * 3 + 2 * i;

trei imagini sunt în lungimea grupului de 345
lungimea imaginii 105
43.125 este raportul de 345/8
8 este o imagine2.left
în consecință, atunci când forma crește, iar stânga crește

și de drumul legat de legăturile componentelor.

a întâlnit o altă problemă

formular, pagecontrol, 2 pagini,
pe eticheta de 1 pagină (RightJustify), ancore (aRight)
și anume eticheta de pe marginea din dreapta este aliniată, proprietatea autosize = true

deci aici,
Când cererea începe, formularul este redimensionat (crește),
2 pagini în mod prestabilit, puneți orice text în etichetă
treceți la prima pagină
și vedeți că eticheta nu sa mișcat în dreapta

și dacă autosize false, totul funcționează bine
Iată o problemă

și dacă după start selectați o pagină, apoi a doua, atribuiți text etichetei, reveniți la primul, apoi OK!

> i: = Runda (StrToFloat (inttostr (GroupBox13.Width)) / (345
> / 105));
> j: = Runda (StrToFloat (inttostr (GroupBox13.Width)) / 43.125)
>;

Mă scuzați, desigur, dar ce fel de trucuri sunt aceste urechi?

În general, aici este un exemplu de cod (dur) care implementează (dacă am înțeles corect sarcina) necesar. Pe de o parte, este oarecum redundantă, pe de altă parte este incompletă, dar este suficient de universală pentru a o completa în direcția cea bună.

# xA0; TAnchorType = (laLeft, atRight, laBottom);
# xA0; TAnchorTypes = set de tip TAnchor;

# xA0; TPlacementPoilitics = înregistrare
# xA0; # xA0; AnchorType: TAnchorTypes;
# xA0; # xA0; LeftCoeff,
# xA0; # xA0; TopCoeff,
# xA0; # xA0; RightCoeff,
# xA0; # xA0; BottomCoeff: Single
# xA0; sfârșitul;

funcția CreatePlacementPolitics (AControl: TWinControl;
# xA0; AType: TAnchorTypes); TPlacementPoilitics;

procedura ApplyPlacementPolitics # xA0; (AControl: TWinControl; Politica: TPlacementPoilitics);

funcția CreatePlacementPolitics (AControl: TWinControl;
# xA0; AType: TAnchorTypes); TPlacementPoilitics;
începe
# xA0; cu Result do
# xA0; începeți
# xA0; # xA0; AnchorType: = AType;
# xA0; # xA0; dacă atLeft în AType atunci
# xA0; # xA0; # xA0; LeftCoeff: = AControl.Left / GetParentForm (AControl); Lățime;
# xA0; # xA0; dacă atRight în AType atunci
# xA0; # xA0; # xA0; RightCoeff: = AControl.Width / GetParentForm (AControl); Lățime;
# xA0; # xA0; dacă laBottom în AType atunci
# xA0; # xA0; # xA0; BottomCoeff: = AControl.Height / GetParentForm (AControl); Înălțime;
# xA0; sfârșitul;

procedura ApplyPlacementPolitics # xA0; (AControl: TWinControl; Politica: TPlacementPoilitics);
începe
# xA0, cu politica
# xA0; începeți
# xA0; # xA0; dacă laLeft în Politics.AnchorType atunci
# xA0; # xA0; începeți
# xA0; # xA0; # xA0; AControl.Left # xA0 ;: = Runda (LeftCoeff * GetParentForm (AControl) .Width);
# xA0; # xA0; sfârșitul;

# xA0; # xA0; în cazul în care atRight în politică.AnchorType atunci
# xA0; # xA0; # xA0; AControl.Width # xA0 ;: = rotundă (RightCoeff * GetParentForm (AControl) .Width);

# xA0; # xA0; dacă laBottom în Politics.AnchorType atunci
# xA0; # xA0; # xA0; AControl.Height # xA0 ;: = Runda (BottomCoeff * GetParentForm (AControl) .Height);
# xA0; sfârșitul;
se încheie;

Exemplu de utilizare (cazul cu 3 panouri din [2] este luat):


tip
# xA0; TForm27 = clasa (TForm)
# xA0; # xA0; Panel2: TPanel;
# xA0; # xA0; Panel3: TPanel;
# xA0; # xA0; Panel1: TPanel;
# xA0; # xA0; procedura FormCreate (expeditor: TObject);
# xA0; # xA0; procedura FormResize (Expeditor: TObject);
# xA0; privat
# xA0; # xA0; Panel1Politică: TPlacementPoilitics;
# xA0; # xA0; Panel2Politics: TPlacementPoilitics;
# xA0; # xA0; Panel3Politics: TPlacementPoilitics;
# xA0; sfârșitul;

procedura TForm27.FormCreate (expeditor: TObject);
începe
# xA0; Panel1Politics: = CreatePlacementPolitics (Panel1, [atRight, atBottom]);
# xA0; Panel2Politics: = CreatePlacementPolitics (Panoul2, [atLeft, atRight, atBottom]);
# xA0; Panel3Politics: = CreatePlacementPolitics (Panel3, [atLeft, atRight, atBottom]);
se încheie;

procedura TForm27.FormResize (expeditor: TObject);
începe
# xA0; AplicațiPlacementPolitics (Panel1, Panel1Politics);
# xA0; AplicațiPlacementPolitics (Panel2, Panel2Politics);
# xA0; AplicațiPlacementPolitics (Panel3, Panel3Politics); # xA0;
se încheie;

Și vă rog să nu vă distrați de toți sfinții din mine, nu faceți așa:
i: = Runda (StrToFloat (inttostr (GroupBox13.Width)) / (345/105));
j: = Runda (StrToFloat (inttostr (GroupBox13.Width)) / 43.125);


> Și vă rog, nu vă supărați pe toți sfinții din mine,
> # xA0; nu mai faceți așa:
> i: = Runda (StrToFloat (inttostr (GroupBox13.Width)) / (345
> / 105));
> j: = Runda (StrToFloat (inttostr (GroupBox13.Width)) / 43.
> 125);

Acest lucru, IMHO, a rămas / s-a format după experimente folosind metoda "blind-poke".

P.S. Și acum oferi o soluție pentru Windows în general! (Schimbați rezoluția ecranului, modificați fontul "mare / obișnuit" etc. etc.)


> Există un formular cu 3 Timage. 1 este în centru în stânga, altul
> exact în centrul formularului, 3 - în centrul din dreapta.

Și care este problema să puneți toate aceste imagini pe panou și să aliniați pe stânga aliniat pe AlLeft chiar pe Alright și central pentru orice altceva?

Și care este problema să puneți toate aceste imagini pe panou și să aliniați pe stânga aliniat pe AlLeft chiar pe Alright și central pentru orice altceva?

Și ai făcut ceva de genul ăsta? Încercați. Nu va fi deloc ceea ce este necesar:
numai imaginea centrală va crește.

> [12] allrussia # xA0; (04.12.06 17:12)
> Elen
>
> Și o problemă pentru a pune toate aceste imagini pe panou și pentru a seta
> la stânga Aliniați-vă de AlLeft direct pe Alright și central
> peste restul?
>
> Și ai făcut ceva de genul ăsta? Încercați. Will, deloc ce
> necesar:
> numai imaginea centrală va crește.

Ați încercat codul în [9]?

Voi încerca să îmi ating scopul

Eraser - 3 posturi nu au citit?

Joe - Nu înțeleg cum să folosesc codul

> [17] allrussia # xA0; (04.12.06 21:28)
> Joe - Nu înțeleg cum să folosesc codul

Asta este?

Joe - unde să îl introduceți în unitatea standard1
încercat 10 minute a încercat toate opțiunile

> [19] allrussia # xA0; (04.12.06 21:32)
> Joe - unde să îl inserați în unitatea standard1
> încercat chinuit timp de 10 minute a încercat toate opțiunile

Pfiu. Acest lucru, îmi pare rău, întrebarea este mult mai scăzută decât nivelul ramurii "Începători", nu ca "Basic". Ei bine, de când am luat-o.

Creați o unitate separată în proiect. Să spunem Unit1.pas. În secțiunea de interfață pe care o puneți folosiți SysUtils, Controls, Forms; și codul
tip

TAnchorType = (atLeft, atRight, atBottom);
TAnchorTypes = set de tip TAnchor;

TPlacementPolilitics = înregistrare
# xA0; AnchorType: Ta nchorTypes;
# xA0; LeftCoeff,
# xA0; TopCoeff,
# xA0; RightCoeff,
# xA0; BottomCoeff: Single
se încheie;

funcția CreatePlacementPolitics (AControl: TWinControl;
AType: Tipuri de activități): TPlacementPoilitics;

procedura ApplyPlacementPolitics # xA0; (AControl: TWinControl; Politica: TPlacementPoilitics);


Deci ai declarat 2 tipuri, 1 funcție și 1 procedură.

Acum, în secțiunea de implementare, adăugați implementarea acestei funcții și a procedurii:

funcția CreatePlacementPolitics (AControl: TWinControl;
AType: Tipuri de activități): TPlacementPoilitics;
începe
cu Rezultatul
începe
# xA0; AnchorType: = AType;
# xA0; dacă atLeft în AType atunci
# xA0; # xA0; LeftCoeff: = AControl.Left / GetParentForm (AControl); Lățime;
# xA0; dacă atRight în AType atunci
# xA0; # xA0; RightCoeff: = Acontrol.Width / GetParentForm (AControl); Lățime;
# xA0; dacă la Bottom în AType atunci
# xA0; # xA0; BottomCoeff: = AControl.Height / GetParentForm (AControl). Înălțime;
se încheie;
se încheie;

procedura ApplyPlacementPolitics # xA0; (AControl: TWinControl; Politica: TPlacementPoilitics);
începe
cu politica
începe
# xA0; dacă este atLeft în Politics.AnchorType atunci
# xA0; # xA0; AControl.Left # xA0 ;: = Runda (LeftCoeff * GetParentForm (AControl) .Width);

# xA0; în cazul în care atRight în politică.AnchorType atunci
# xA0; # xA0; AControl.Width # xA0 ;: = rotundă (RightCoeff * GetParentForm (AControl) .Width);

# xA0; dacă laBottom în politică.AnchorType apoi
# xA0; # xA0; AControl.Height # xA0 ;: = Runda (BottomCoeff * GetParentForm (AControl) .Height);
se încheie;
se încheie;

Funcția CreatePlacementPolitics creează o înregistrare cu informații despre "legarea" moștenitorului TWinControl la acesta.
Procedura ApplyPlacementPolitics aplică politica de legare salvată anterior pentru TWinControl specificat.

Apoi, în forma principală, în secțiunea secțiuni a secțiunii de interfață, adăugați unitatea1.
Plasați cele trei panouri pe formular și plasați-le în timp ce le-ați atras în post [2].
Creați în clasă forme de trei variabile private, și anume:
tip
TForm27 = clasa (TForm)
# xA0;.
privat
# xA0; Panel1Politics,
# xA0; Panel2Politics,
# xA0; Panel3Politics: TPlacementPoilitics;
se încheie;

Apoi, în evenimentul OnCreate al formularului, definiți politica de plasare a panourilor proprii și a le salva în câmpurile private corespunzătoare pentru utilizare ulterioară:
procedura TForm27.FormCreate (expeditor: TObject);
începe
Panel1Politics: = CreatePlacementPolitics (Panel1, [atRight, atBottom]);
Panel2Politics: = CreatePlacementPolitics (Panel2, [atLeft, atRight, atBottom]);
Panel3Politics: = CreatePlacementPolitics (Panel3, [atLeft, atRight, atBottom]);
se încheie;
Și, în cele din urmă, în formatul OnResize, am aplicat panourilor o politică de alocare pre-stocată (pentru fiecare panou - proprie):
procedura TForm27.FormResize (expeditor: TObject);
începe
AplicațiPlacementPolitics (Panel1, Panel1Politics);
AplicațiPlacementPolitics (Panel2, Panel2Politics);
AplicațiPlacementPolitics (Panel3, Panel3Politics); # xA0;
se încheie;

Ne pare rău, alinierea a alunecat.

verificat codul
funcționează doar pe 50% - la creșterea fopmy toate ok
atunci când scade:
1) al treilea panou scade în mod necorespunzător
2) dacă Timage se află pe panou, acesta se învârte la 180 de grade de-a lungul axei orizontale și începe oglindirea

Am încercat așa cum am sfătuit Nail, un pic mai bine, dar glitches nu dispar
Desigur, poate că nu înțeleg ce?
Ce aliniere ați aliniat la panouri?

codul meu a funcționat mai bine.

Am un mic comentariu despre codul lui Joe. Politica este mai bine să se înlocuiască cu politica și apoi cu ochii tăiate :)

> [22] allrussia # xA0; (14.12.06 20:53)
> ceea ce aliniați alinierea ați plasat pe panouri?

Nu.
Cu o scădere, desigur, erorile de rotunjire vor fi vizibile. Tocmai am arătat că o implementare concretă trebuie să fie adusă în minte printr-un fișier :)

Încercați pentru fiecare imagine folosiți TPanel, panourile, la rândul lor, plasați pe "platformă". Puteți seta alinierea panourilor,

Pe scurt, am venit cu acest cod. Funcționează pe 100%. Precizie - 1 diviziune a dimensiunii controlului. Problema este rezolvată. Subiect - pentru resturi: p

# xA0;
începe
# xA0; i: = (GroupBox13.Width - 4) Divizorul 3;
# xA0; j: = (GroupBox13.Width - 4) mod 3;
# xA0; cazul j din
# xA0; 0: începeți
# xA0; # xA0; # xA0; Panel1.Width: = i;
# xA0; # xA0; # xA0; Panel2.Width: = i;
# xA0; # xA0; # xA0; Panel3.Width: = i;
# xA0; # xA0; se încheie;
# xA0; 1: începeți
# xA0; # xA0; # xA0; Panel1.Width: = i;
# xA0; # xA0; # xA0; Panel2.Width: = i + 1;
# xA0; # xA0; # xA0; Panel3.Width: = i;
# xA0; # xA0; se încheie;
# xA0; 2: începeți
# xA0; # xA0; # xA0; Panel1.Width: = i + 1;
# xA0; # xA0; # xA0; Panel2.Width: = i;
# xA0; # xA0; # xA0; Panel3.Width: = i + 1;
# xA0; # xA0; se încheie;
se încheie;

Memorie: 0,81 MB
Înclinare: 0.094 sec