C++ Builder przekazywanie danych przez wskaźnik

0

Cześć,

Głównym problemem z jakim się do Was zwracam to przekazywanie danych przez wskaźnik pomiędzy formularzami przy aplikacji VCL.
Mam np. dwie formatki. Form1 i Form2. Przechodząc z Form1 na Form2 chcę tworzyć wskaźnik i ustawiać jego wartość żeby odczytać jego wartość na Form2 (wartość będzie sczytywana z pola Edit->Text, bo to będzie string).
Mo i się zaczęło.
Na Form1 mam pole Edit i przycisk "skocz do Form2".
w akcli click dla przycisku tworzę sobie kod

String *wsk;
wsk = Edit1->Text;
Form2->ShowModal();

Build Project -> i już pierwszy ZONK: [bcc32c Error] Unit1.cpp(21): assigning to 'System::String *' (aka 'System::UnicodeString *') from incompatible type 'Vcl::TCaption' (aka 'System::UnicodeString')

Nie wiem dlaczego to nie działa skoro po jednej i drugiej stronie jest UnicodeString
Totalnie nie kumam tych zamian UnicodeString, String WideString itd.
Wiem co to jest ASCI, ANSI, ISO, strony kodowe, Unicode ale totalnie nie umiem tego przenieść na te wszystkie char, wchar_t, String, string, WideString itd. w Builderze.
jest jakiś fajny tutek do czegoś takiego?

0

Cały duży opis pachnie trochę problemem XY, dodatkowo bez MWE.
Ale nie pokazałeś najważniejszego:
Jak wygląda fragment, o którym krzyczy Ci kompilator ([bcc32c Error] Unit1.cpp(21))?


Z tego co jednak rozumiem, Twój problem jest bardzo podobny do tego: How to put TEdit data into String C++ Builder.
Pierwsze co rzuca się w oczy: Spróbuj użyć właśnie Edit1->GetTextBuf() zamiast pobierać tekst bezpośrednio.
Warto też przeczytać cały przytoczony przeze mnie wątek.

0

Wędka zamiast rybki: wpisujesz Edit1->T i czekasz na podpowiedź w podpowiedzi widzisz jakiego typu jest Edit1->Text właśnie tego typu używasz.
Napisz swoją metodę dla Form2 z parametrem: Form1 *main
przykład wywołania: Form2->ShowModalWithMain(this);

0

przytoczony wcześniej błąd generuje linia

wsk = Edit1->Text;

przykład ze wskazanego wątku działa

int Size = Edit1->GetTextLen();
	Size++;
	Char *Buffer = new Char[Size];
	Edit1->GetTextBuf(Buffer, Size);
	ShowMessage(Buffer);

ale dalej nie rozwiązuje to mojego problemu
ja potrzebuję przekazać jakiegoś stringa z jednego formularza do drugiego poprzez wskaźnik, tzn ja sobie tak założyłem że to ma być wskaźnik
ok no to szerszy plan.
Mój problem polega na tym że mogę wejść np. na Form2 z kilku formatek np. z Form1 i z Form3.
Na formatce Form2 wykonywane są pewne czynności w zależności od tego z której formatki "przyjdę".
Form2 wywołuję zawsze jako okno modalne ( ShowModal() ) z któregoś forma np. 1 lub 3 i zawsze później wracam na ten form.
Żeby Form2 wiedział że przyszedłem np. z Forma1 to wymyśliłem to tak że na form1 i form2 będą zdefiniowane dwa wskaźniki. Przy przejściu do wskaźnika na form1 będę wrzucał nazwę formatki i przy wywołaniu form2 wskaźnikowi na form2 będę przypisywał adres z form1 i na form2 będę odczytywał nazwę formatki z której przyszedłem na tego forma. Kurde nie wiem czy nie zakręciłem ale myślę, że nie.
Co myślicie o takim sposobie?
Chyba że ktoś ma inny łatwiejszy sposób?

0

Jeżeli czegoś nie rozumiesz w tym co podałem wyżej to należy zapytać a nie wymyślać kolejne bezsensowne rozwiązania.
Czemu nie chcesz skorzystać z wędki? System::String text=Edit1->Text;
Jak potrzebujesz przekazać text to zrób to w metodzie ShowModalWithParams

void Form2::ShowModalWithParams(const System::String caption)
{
    this->Caption=caption;
    ShowModal();
}
0

Nie upieram się przy wskaźnikach. Tylko myślałem że wskaźniki są bardziej uniwersalne. Ale przetestowałem sobie Twoje rozwiązanie i jest OK działa tak jak chciałem :) Dzięki

A mógłbyś podpowiedzieć jak by to mogło wyglądać na wskaźnikach że jeszcze zostanę przy tym temacie (tak dla ćwiczenia).

1
KiK napisał(a):

A mógłbyś podpowiedzieć jak by to mogło wyglądać na wskaźnikach że jeszcze zostanę przy tym temacie (tak dla ćwiczenia).

Ma wyglądać. nijak, zwyczajnie unikaj wskaźników.
Problem w tym że trzeba pilnować czas życia takiego wskaźnika.

struct Form2Params
{
    System::String caption;
    TForm *caller;
    int X,Y;
};

void TForm1::CallForm2()
{
    Form2Params  params;
    params.caller=this;
    params.caption=this->Caption;
    Form2->ShowModalWithParams(params);
}

void TForm2::ShowModalWithParams(const Form2Params  &params)
{
    this->Caption=params.caption;
    ShowModal();
}
1

Jak bardzo chcesz (musisz?) używać wskaźników, to shared_ptr albo unique_ptr -- wtedy nie musisz pilnować ręcznie czasu życia.

I jeszcze dla formalności:

_13th_Dragon napisał(a):

Problem w tym że trzeba pilnować czas życia takiego wskaźnika.

Czasu życia danej wskazywanej, nie wskaźnika. :)

0

@KiK: Twój problem to nie brak zrozumienia unicode, a systemu typów i konwersji pomiędzy typami. @_13th_Dragon dał Ci rozwiązanie, ale mam wrażenie, że nie rozumiesz dlaczego działa, podczas gdy Twój sposób nie. W ramach nauki przeanalizowałbym co źle jest w Twoim kodzie, a nie próbował na siłę wcisnąć wskaźniki w miejsce, gdzie nie są potrzebne.

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