Avatar billede the_saint Nybegynder
20. september 2005 - 18:38 Der er 10 kommentarer og
1 løsning

Finde control

Hej ;D

Jeg har en streng, indeholdende navnet på et TEdit felt, kan jeg på nogen måde gøre sådan at jeg kan bruge den streng til at hente "Text" ud fra det Edit felt?
Avatar billede bertelbrander Novice
20. september 2005 - 19:39 #1
Jeg tror at du skal uddybe lidt.
Mener du at du har et navn, f.ex "Edit1", i form af en streng, og så vil du have texten fra kontrollen Edit1 læst ud i en anden streng.

Det er sansynligvis muligt, specielt hvis man på forhånd kender mulige navne.
Hvad er formålet?
Avatar billede the_saint Nybegynder
20. september 2005 - 19:44 #2
Formålet er at jeg i min database har en liste med nogle værdier, som hører til en række Edit felter i min form ...
Men istedet for at jeg skal lave en kæmpe switch case, så ville det være nemmere hvis jeg bare kunne bruger navnet på feltet, som ligger i tabellen, og så hente dataen fra felterne ud sådan :)
Avatar billede bertelbrander Novice
20. september 2005 - 19:54 #3
Ok, du har noget i stil med:
char S1[13], S2[32];
GetFromDataBase(S1, S2);

Og vil gerne
Something(S1)->text = S2;

Det kan man ikke uden videre i C++. Når programmet kører har man ikke adgang til tings(/controllers) navne, og endnu mindre adgang til et tabel hvor man kan slå dette op.

Jeg ville nok lave en tabel med alle edit-kontollerne, og så gemme et nummer i databasen, så kan du:

char S2[32];
int EditIdx;
GetFromDataBase(EditIdx, S2);
MyTable[EditIdx]->text = S2;
Avatar billede the_saint Nybegynder
20. september 2005 - 21:10 #4
Kan ikke helt kringle din pseudo-kode.. Så ...

Min tabel ser sådan ud...
id navn  værdi
1  Edit1 001
2  Edit2 002
3  Edit3 003
osv.


På min form har jeg så
Edit1
Edit2
Edit3

Nu henter jeg så data fra databasen, altså, værdierne 001 002 og 003.
De skal nu ligges ind i de edit felter der er angivet i tabellen
Avatar billede bertelbrander Novice
20. september 2005 - 21:55 #5
Jeg ville lave:
TEdit *MyTable[] =
{
  0,
  Edit1,
  Edit2,
  Edit3
};

Når du så skal skrive teksten (som jeg formoder er 001?) til Edit1, vil id være 1 og du kan skrive dette til edit kontrollen:
MyTable[id]->text = "001";

Husk at initialisere tabellen EFTER Edit1, Edit2, ... har fået deres værdi.
Avatar billede the_saint Nybegynder
20. september 2005 - 22:12 #6
Det forvirre mig utroligt meget det der ...
Tror jeg prøver at omformulere, og glemme den database...
Jeg har en streng indeholdene "Edit1".
Ydermere har jeg et felt der hedder "Edit1"..

Nu vil jeg gerne have at vha af min streng, at jeg finder mit control..
Således at jeg kan redigere mit control's properties .... (Text, width, height osv)
Avatar billede bertelbrander Novice
20. september 2005 - 22:33 #7
Det jeg forsøgte var at få dig til at have et tal med et id på kontrollen og ikke en streng med navnet.

Du kan bruge en std::map til at mappe mellem navn og control:
std::map<std::string, TEdit *>MyMap;
MyMap["Edit1"] = Edit1;
MyMap["Edit2"] = Edit2;
MyMap["Edit3"] = Edit3;

Så kan du slå op i denne map:

MyMap["Edit1"]->Text = "Whatever";
Avatar billede the_saint Nybegynder
20. september 2005 - 22:51 #8
Det er vist langt ud over det pensum vi får i skolen =)
Kan du forklarer hvad der sker og hvordan det fungere?
Avatar billede bertelbrander Novice
20. september 2005 - 23:10 #9
Hvis ikke du har arbejdet med std::map før er det måske en lidt stor mundfuld, du kan læse mere om dem her:
http://www.sgi.com/tech/stl/Map.html

(Jeg kan specielt godt lide deres bemærkning:  "Note that the definition of operator[] is extremely simple: m[k] is equivalent to (*((m.insert(value_type(k, data_type()))).first)).second.")

En std::map er en container, der indeholder par (std::pair), den ene værdi er key/first og den anden værdi er data/second. Data i en std::map er altid sorteret efter key/first.

I mit eksempel er key en std::string, dette er navnet på kontrollen, så mappen er altid sorteret efter navn. data er i eksemplet en TEdit *

Linien:
std::map<std::string, TEdit *>MyMap;
Oprtter en tom mappe med disse egenskaber.

Denne linie:
MyMap["Edit1"] = Edit1;
Sætter element ["Edit1"] til at indeholde Edit1, da der ikke findes et sådant element vil det blive oprettet.

Denne linie:
MyMap["Edit1"]->Text = "Whatever";
Slår op i mappen, finder det element der har navn "Edit1" (dvs Edit1), og sætter dens Text til "Whatever".

Vi kan også sige at en std::map opfører sig som et dynamisk array, hvor man kan bruge hvad som helst som index (det skal blot være sammenlignelig).
Avatar billede the_saint Nybegynder
21. september 2005 - 08:07 #10
Tror jeg laver det som en switch case :D
Smid et svar, kigger måske i det på et senere tidspunkt :)
Avatar billede the_saint Nybegynder
23. september 2005 - 09:17 #11
Lukker.. Der blev ikk smidt svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester