26. marts 2004 - 22:35Der er
12 kommentarer og 1 løsning
database-kontakt - mellem to forms
Jeg er stødt ind i et lille problem. På min hovedform, vælger man en post fra en database, som skal kunne ændres fra en anden form, men hvordan tjekker jeg hvilket felt der er valg i hovedformen fra min sekundære form?
Det jeg mener er at jeg har en main form hvor man bla.kan vælge en bestemt bruger.
Hvis jeg så klikker på "rediger bruger" kommer der et nyt vindue frem, meden række DBEdit felter for netop denne bruger frem, hvor jeg kan ændre forskellige instillinger. Nu er problemet bare at jeg fra den sekundære form (ændre-formen) ikke kan se hvilken bruger der er valgt på main-formen.
Okey. Er rimelig ny i Delphi. Havde regnet med at når jeg smed DBEdit felter på den nye form, kunne jeg vælge DataSource og DataField i Object Inspector, men det kunne jeg selvfølgelig ikke... Hvordan kan jeg praktisk gøre det?!?
1. Du kan lave en CallBack-kobling hvor din form2 har fortalt form1 (via kode, naturligvis) at den skal sørge for form2'eren. Selvom det er en meget brugt tilgang er det ikke særlig objektorienteret:
procedure TForm1.DataSourceOnDataChange(); begin // Ikke et godt eksempel da du tilsyneladende bare får det felt der modificeres // (er det nu også sandt - har ikke tjekket) - du får eksemplet alligevel ;-) Form2.Edit1.Text := Field.AsString; end;
Det andet er, at have dine databasekomponenter placeret på et TDataModule som de begge deler via deres "uses". Dette modul er beregnet til "non-visuelle" komponenter og et naturligt sted at placere DB-komponenter som deles, dvs. TADOConnection, TADOTable/TADOQuery og måske også TDataSourc.
Hvis du har DB-felter på begge forme, så vil de følges ad. Rykker du eksempelvis een linie ned i form1 så skifter alle DB-felterne i form2.
Løsningen med er TDataModule lyder som en rigtig god løsning. Men hvordan gør jeg det? er det ikke et kæmpe arbejde når jeghar oprettet minedatabasekomponenter på min main-form?
Når jeg har placeret mine komponenter på et TDataModule og har adgang til det vha. Alt-F11, så bruger jeg følgende (lidt doven DataModuler angår, kalder det altid "DM"):
begin with DM do begin Query1.SQL.Text := '' osv. end; // with end;
Med F11 angiver du at den nuværende fil skal gøre brug af DM og de ting den stiller til rådighed.
I DM'en plejer jeg at bruge dens OnCreate og OnDestroy til at åbne og lukke tabellerne:
OnCreate: ADOConnection.Open; ADOTable.Open;
OnDestroy; ADOTable.Close; // I omvendt rækkefølge ADOConnection.Close;
Men når jeg gør det, så skal jeg ind i Tools/Options <shift-ctrl-f11> for at flytte DM'eren allerøverst foran de forme der autokreeres (under fanebladet "Forms"). Nemmest at flytte den op vha. musen.
Hvis du arbejder med ADO så skal du lige huske at slå ADOConnection's LoginPrompt fra og ADOTables DirectAccess til (du skal naturligvis også lige huske at lave en ConnectionString vha. trykke på ...-knappen og vælge Build (vælg ADO DB Jet) og angiv stieen til databasen (mdb-filen))).
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.