Wyswietlanie wartosci w drugiej formatce

0

Mam problem mianowicie tego typu ze mam dwie formatki(Form1 i Form2). No i chce zrobic tak aby po wcisnieciu buttona(w Form2) tekst w Edicie(Form1) ulegal zmianie ... w jaki sposob mam skonstruowac taka funkcje?? szczerze nie mam nawet pomyslu jak dotad jak to zrobic ...
Prosze o pomoc i z gory dziekuje.

0

Jedno z:

  1. Konstruktor Form2 przyjmuje i zapisuje w składowych wskaźnik na Form1.
  2. Form2 wysyła komunikat WM_APP+1 z parametrem określającym zmiany.
  3. (Form1*)(Application->MainForm)->Edit1->Text="xxx";
  4. Wyszukać w (Screen->Forms[i]->ClassName=="TForm1")
0

Hm... w jaki sposob to zrobic aby to mialo miejsce i nogi? bo szczerze nie rozumiem za bardzo z tym wskaznikiem. gdzie do czego go okreslic?

0
_13th_Dragon napisał(a):

Jedno z:

  1. Konstruktor Form2 przyjmuje i zapisuje w składowych wskaźnik na Form1.
  2. Form2 wysyła komunikat WM_APP+1 z parametrem określającym zmiany.
  3. (Form1*)(Application->MainForm)->Edit1->Text="xxx";
  4. Wyszukać w (Screen->Forms[i]->ClassName=="TForm1")

otoz jak zrobic to co opisales w pierwszym punkcie? bo chcilbym miec jakis przyklad bo tak w locie nie lapie
z tym komunikatem w drugim punkcie ogolnie wcale nie rozumiem reszte mniej wiecej ogarniam i wydaje mi sie ze sobie poradze ... No ale musze wiedziec co z tym wskazniikiem i przede wszystkim gdzie...
Prosze o odpowiedz

0
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
 TEdit *Edit1;
 TButton *Button1;
 void __fastcall Button1Click(TObject *Sender);
private:	// User declarations
public:		// User declarations
 __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------

#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
class TForm1;                                                                             // <= BARDZO WAŻNE
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
__published:	// IDE-managed Components
 TButton *Button1;
 void __fastcall Button1Click(TObject *Sender);
private:	// User declarations
  TForm1 *Frm;
public:		// User declarations
 __fastcall TForm2(TComponent* Owner,TForm1 *frm);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"                                                                       // <= BARDZO WAŻNE
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TForm2 *f=new TForm2(Application,this);
 f->ShowModal();
 delete f;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"                                                                       // <= BARDZO WAŻNE
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner,TForm1 *frm)
 : TForm(Owner), Frm(frm)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
Frm->Edit1->Text="xxx";
}
//---------------------------------------------------------------------------
0

Probowalem w ten sposob i wyskakuje mi

//---------------------------------------------------------------------------

#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <fstream.h>
TForm1 *Form1; //DECLARATION SYNTAX ERROR
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
__published:	// IDE-managed Components
        TButton *Button1;
        TLabel *Label1;
        TLabel *Label2;
        TLabel *Label3;
        TButton *Button2;
        TButton *Button3;
        TButton *Button4;
        TButton *Button5;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall Button4Click(TObject *Sender);
        void __fastcall Button5Click(TObject *Sender);
private:
        TForm1 *Frm; 	// TYPE NAME EXPECTED
public:
 	// User declarations
     
        __fastcall TForm2(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif 

i nie moge nawet skompilowac przez te dwa bledy a nie wiem co z tym zrobic

0
TForm1 *Form1;

zamieniamy na:class TForm1;

0
void __fastcall TForm2::Button5Click(TObject *Sender)
{
  Frm->Edit1->Text = "tT";
}

Edit1 is not member of TForm1 because type is not yet defined

:s

0

Zapomniałeś do Unit2.cpp dołączyć: #include "Unit1.h"

0

Nie kompiluje mi sie teraz a blad jest okreslony jako:
[Linker Error] Unresolved external '_Form1' referenced from C:/....?Projekt1.obj

1

Pewnie usunąłeś wiersz:

TForm1 *Form1;

z Unit1.cpp

0

No faktycznie ... nie wiem po co ale przypadkiem musialem usunac przez pomylke.
Koniec koncow zaczelo dzialac.
Teraz chcialbym przejsc do sedna sprawy mianowicie funkcji ktora ma zawartosci okreslonych editow kopiowac do editow z Form1

 void przenies (int x)
{
     int a=1*x;
     int b=17*x;
     int p=1;
          for ( a; a<b ; a++)
           {
                dynamic_cast<Frm->TEdit *>(FindComponent("Edit" + (String)p))->Text = dynamic_cast<TEdit *>(FindComponent("Edit" + (String)a))->Text;        		// User declarations
          p++
 }
}

Funkcja ma działac w ten sposob, że pobiera x i na podstawie tego z okreslonych editow przyporzadkowuje wartosci dla editow w Form1... Da sie to jakos przyporzadkowac za pomoca dynamic casta? funkcja zadeklarowac jest w unti3.h i w unit3.cpp ma byc wywolywana.

Moj kod wyglada tak ... kombinowalem jeszcze z tym jakos ale jak dotad nie chce mi sie skompilowac.... w ktorym miejscu jest blad?

0

Czy dobrze rozumiem że masz na Form1 Edit1, Edit2, ... Edit17
Zaś na drugiej formatce Edit1, Edit2, ... Edit17, Edit18, Edit19, ... Edit34 lub może więcej
I chcesz przepisać z paczki 17 szt (1..17) lub (18..34) do Form1 (1..17) ?

0

Otoz to ... chce uzyc do tego jednej funkcji zeby bylo szybciej uzyc dynamic_casta ktorego wielokrotnie stosowalem przy pracy z plikiem.
Ma to wygladac tak ze przy wybraniu okreslonego RadioButtona(jest ich 12 - miesiace), i zatwierdzeniu Buttonem, kopiuje wartosci z jednej kolumny (Edity poustawiane sa w GroupBoxach w kolumny) do Editow w Form1. Jak juz zdazyles zauwazyc jest ich faktycznie 17. program jest zrobiony tak ze kolejnosc jest dobra i nie przypadkowa tzn. Edit1 w Form3 odpowiada Edit1 w Form1 itd. a przy 18 cykl sie powtarza( Edit18 w Form3 odpowiada Edit1 w Form1)...
No i wlasnie chce te wartosci moc spokojnie kopiowac. pozostanie pewnie jak rozroznic RadioButtony zeby kazdy przybieral wartosci int, ale to mozna zrobic recznie (choc niezbyt estetycznie to bedzie wygladac) natomiast z ta funkcja to za bardzo nie mam pomyslu.

0
  1. Na formatkę Form1 wrzuć Panel na ten panel przerzuć wszystkie Edit1..Edit17 tylko te 17 kontrolek i nic więcej, inne rzeczy muszą być poza Panelem.
  2. Na formatkę Form2 wrzuć Panel na ten panel przerzuć wszystkie Edit1..Edit17 tylko te 17 kontrolek i nic więcej, inne rzeczy muszą być poza Panelem.
  3. Na formatkę Form2 wrzuć drugi Panel na ten panel przerzuć wszystkie Edit18..Edit34 tylko te 17 kontrolek i nic więcej, inne rzeczy muszą być poza Panelem.

Do funkcji przekazujesz wskaźnik na Panel z Form1 i wskaźnik na jeden z Paneli z Form2
(TPanel F1,TPanel F2)
Kopiowanie całości:
for(unsigned i=0;i<F1->ControlCount;++i) ((TEdit
)(F1->Controls[i]))->Text=((TEdit
)(F2->Controls[i]))->Text;

  1. Zamiast TPanel może być np GroupBox
  2. Jak masz tak potworne ilości kontrolek to zastanów się nad zmianą tego na np StringGrid'a lib TListView lub najlepiej na VirtualTreeView.
0

No w Form2 jest ponad 200 editow ktore znajduja sie w groupboxach(musza tam byc bo Caption groupboxa jest uzywany jako wczytywana nazwa miesiaca - z pliku ) i w tychze groupboxach sa tez labele opisujace poszczegolne eidty. W Form1 Edity sa bez panela bez niczego i znajduje sie tam jeden GroupBox z podliczeniami (Labele). Nie da rady tego zrobic tak aby nie trzeba bylo w Form1 ograniczac Editow panelem lub groupboxem?
Bo bym musial caly program zmieniac w okolicznosci gdybym uzywal innych metod zamiast tych editow. koniec koncow i tak to zapewne zrobie ale poki co jest mi potrzebne wlasnie takie przerzycanie informacji.

1

To zrób to tak, w klasie TForm1
TEdit *Tb[17];
W konstruktorze TForm1
Tb[0]=Edit1;
Tb[1]=Edit2;
...
Tb[16]=Edit17;
W klasie TForm2
TEdit *Tb[NieWiemIle][17];
Tb[0][0]=Edit1;
Tb[0][1]=Edit2;
...
Tb[0][16]=Edit17;

Tb[1][0]=Edit18;
Tb[1][1]=Edit19;
...
Tb[1][16]=Edit34;

Jak kopiować to chyba się domyślisz.
Z tym ze przy takich ilościach editbox'ow przy potrzebie dodatkowych opisów koniecznie trza przejść na VirtualTreeVew

Wg mnie musisz stworzyć odpowiedni Frame i wstawiać na formatki na Form1 jednego a na Form2 kilka takich Frame'ów.
We Frame zrobić to dynamicznie.
przed klasą:

const char *Names[]={'Nazwa1','Nazwa2',...,'Nazwa17'};
const unsigned NameCount=sizeof(Names)/sizeof(*Names);

W klasie:

TEdit EditTb[NameCount];

W konstruktorze:

for(unsigned i=0;i<17;++i)
  {
   TLabel *Lbl=new TLabel(this);
   Lbl->Name=AnsiString("Lb")+IntToStr(i);
   Lbl->Caption=Names[I];
   Lbl->Layout=tlCenter;
   Lbl->BoundsRect=Bounds(4,4+25*i,50,21);
   Lbl->Parent=GroupBox1;
   TEdit *Edt=new TEdit(this);
   Lbl->Name=AnsiString("Ed")+IntToStr(i);
   Edt->Text='0';
   Edt->BoundsRect=Bounds(54,4+25*i,50,21);
   EditTb[i]=Edt;
  }

Oraz przyda się metoda kopiująca z innego Frame'a ale masz ulatwione bo wszystkie Edit'y siedzą grzecznie w tablicy.

0

To wszystko opiera sie na tym ze trzeba w cholere kodu pisac a mi zalezy na przejrzystosci.... nie dalo by rady zrobic tak zeby funkcja zwracala wskazniki na Edity w Form1, druga funkcja ktora by pobierala wartosc(indeks) z Radiobuttona. i ze wzgledu na to robila wskazniki do poszczegolnej paczki wskaznikow a nastepna funkcja by podporzadkowala wskaznikom jednej funkcji wartosci wskaznikow drugiej. Jest w ogole cos takiego mozliwe czy to co psize to calkowita herezja??

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