CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Problem z kontrolką Label.
Strona 2 z 2

Re: Problem z kontrolką Label.

Nowy postNapisane: piątek, 6 lipca 2018, 08:32
przez lukagrom
Też potwierdzam, że tradycyjnia skadnia C/C++, dla standardowych typów (int, char, double, etc...) jak najbardziej działa dla przypisania 3 zmiennych:
KOD cpp:     UKRYJ  
int licznik=1,a,b;
 b=a=licznik;
 

Natomiast przypisanie potrójne dla właściwości Caption zwracającej - UnicodeString, wywala błędy:
KOD cpp:     UKRYJ  
UnicodeString text="Poland";
Label1->Caption=Form1->Caption=text;
 


[bcc32 Error] _m_rown1.cpp(22): E2492 Properties may only be assigned using a simple statement, e.g. "prop = value;"

Coś czuje, że to duch Delphi/Object Pascala w sprawach komponentowych się odzywa.

Re: Problem z kontrolką Label.

Nowy postNapisane: piątek, 6 lipca 2018, 09:00
przez lukagrom
Chyba jednak tak ma być, bo Visual C++ zachowuje się identycznie. 2 właściwości komponentów idzie przypisać, 3 par już nie.
KOD cpp:     UKRYJ  
 System::String^ text="C++";
 
label1->Text=button1->Text=text ;//error
 


'void System::Windows::Forms::Control::Text::set(System::String ^)' : cannot convert parameter 1 from 'void' to 'System::String ^'
1> No user-defined-conversion operator available, or
1> Expressions of type void cannot be converted to other types

Re: Problem z kontrolką Label.

Nowy postNapisane: piątek, 6 lipca 2018, 10:54
przez polymorphism
W przykładzie z Visuala to duch C# się odzywa, bo w obu przypadkach semantyka przypisania znana z C/C++ nie jest zachowana. Ciekawe, czy to ma jakieś sensowne uzasadnienie, czy po prostu "tak wyszło".

Re: Problem z kontrolką Label.

Nowy postNapisane: piątek, 6 lipca 2018, 12:51
przez lukagrom
Jeszcze dla upewnienia się na "czystych intach" sprawdziłem potrójne przypisania, bo teoretycznie cyfra to cyfra, a tekst to może mieć jakieś bufory, czy inne takie.
KOD cpp:     UKRYJ  
int dlugosc,szerokosc,wzorzec=Panel1->Width*3;
 dlugosc=szerokosc=wzorzec;
 Form1->Width=dlugosc;
 Form1->Height=szerokosc;
 

i to jest rzeczywiście dziwaczne, że zrobione to samo, na właściwościach int komponentów, z pominięciem zmiennych int wywala już błędy, te same co wcześniej:
KOD cpp:     UKRYJ  
Form1->Width=Form1->Height=Panel1->Width*3;
 

Visual C++ na "czystych intach" zachowuje się ponownie analogicznie.
Można by było jeszcze sprawdzić, czy taki zapis "potrójny-intowski" zostanie zaakceptowany, przy dynamicznym tworzeniu komponentu:
KOD cpp:     UKRYJ  
 TButton *nowy_Bt = new TButton(this);
 nowy_Bt->Parent=this;
 nowy_Bt->Width=nowy_Bt->Height=100;
 

I tutaj także, ten sam błąd. Reasumując, jest parcie na deklarowanie i używanie zmiennych, jeśli chce się manipulować wartościami właściwości komponentów.

Re: Problem z kontrolką Label.

Nowy postNapisane: piątek, 6 lipca 2018, 13:42
przez polymorphism
Można by było jeszcze sprawdzić (...)

To bez znaczenia. Przypisanie do właściwości to jest nic innego jak wywołanie metody np. setHeight czy setWidth. Zapewne te mutatory zwracają typ void i dlatego nie można zrobić wielokrotnego przypisania. To samo byłoby, gdyby napisać operator przypisania w ten sposób:
KOD cpp:     UKRYJ  
class foo
{
public:
    void operator=(const foo&) {}
};

...

foo a, b, c;
   
b = c; // ok
a = b; // ok

a = b = c; // błąd
 

Dlatego dla zachowania semantyki przypisania operator przypisania zwykle zwraca obiekt this.

Re: Problem z kontrolką Label.

Nowy postNapisane: piątek, 6 lipca 2018, 16:14
przez lukagrom
Na pocieszenie, można dowolną ilość zmiennych przypisywać do wartości właściwości jednego komponentu.
KOD cpp:     UKRYJ  
 int a,b,c,d,e,f,g,h,i;
 a=b=c=d=e=f=g=h=i=StrToInt(Panel1->Width);
 UnicodeString a1,b1,c1,d1,e1,f1,g1,h1,i1;
 a1=b1=c1=d1=e1=f1=g1=h1=i1=Form1->Caption;