[delphi] listsource aanpassen

Pagina: 1
Acties:

  • ksmedts
  • Registratie: Januari 2002
  • Laatst online: 16-12-2021
Ik probeer de listsource van een tdblookupcombobox dynamisch aan te passen, de combobox wordt aangemaakt met de volgende code:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
  with tdblookupcombobox.Create(self) do
  begin
    Left := 360;
    Top := vartop;
    Height := 21;
    Width := 145;
    Listsource := dszoekveld;
    ListField := 'naam';
    Keyfield := 'naam';
    visible := true;
    parent := frmsearch;
  end;



Deze bovenstaande code werkt goed alleen nu wordt altijd de datasource dszoekveld gebruikt, dit is niet de bedoeling. De ene keer moet daar dszoekveld staan en de andere keer moet daar dszoekorder staan, nu kan ik dat wel doen door een case te gebruiken maar het lijkt mij vrij omslachtig om dezelfde code 25 keer in een case te zetten.

Wat ik dus eigenlijk wil is een string converteren naar tdatasource, of een andere manier om de listsource dynamisch toe te wijzen.

Ik hoop dat bovenstaande een beetje duidelijk maakt wat ik wil doen.

[ Voor 3% gewijzigd door ksmedts op 19-07-2005 14:22 ]


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:59

alienfruit

the alien you never expected

Ik snap het probleem niet....

  • ksmedts
  • Registratie: Januari 2002
  • Laatst online: 16-12-2021
als ik mijn listsource probeer te vullen met een variabele van het type string dan krijg ik de mededeling dat die incompatible is, wat ik me goed kan voorstellen want hij zou van het type tdatasource moeten zijn.

daarom zou ik graag weten hoe ik de string die ik heb kan converteren naar een tdatasource... of een volledig andere manier, als ik de listsource maar variabel kan vullen.....

meer zoiets als onderstaand voorbeeld:
Delphi:
1
2
3
4
5
6
7
8
9
                  Left := 50;
                  Top := vartop;
                  Height := 21;
                  Width := 145;
                  Listsource := adoqzoekveld.FieldByName('zoek_tabel').text;
                  ListField := adoqzoekveld.FieldByName('zoek_veld').text;
                  Keyfield := adoqzoekveld.FieldByName('zoek_veld').text;
                  visible := true;
                  parent := frmsearch;

krijg dus de foutmelding dat ze niet compatible aan elkaar zijn...

[ Voor 46% gewijzigd door ksmedts op 19-07-2005 14:22 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:57

Creepy

Tactical Espionage Splatterer

Logisch, want een string is heel iets anders dan een datasource ;)
Maar als zoekveld een TField is (heb ff niet de tijd om dat na te kijken) dan moet je je eens gaan verbazen over het type dat FieldByName('zoek_tabel') teruggeeft. Daarnaast moet je de properties eens bekijken van adoqzoekveld en adoqzoekveld.FieldByName('zoek_tabel'). Daar zit zeer waarschijnlijk wel iets bruikbaars tussen ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:26

Tomatoman

Fulltime prutser

Zet om te beginnen de code eens tussen code tags :)[norml]:[/]

[code=delphi]
bla bla
[/]

Je haalt twee begrippen door elkaar, namelijk de naam van een object en een verwijzing naar een object. Je kent nu de naam van een TField (de naam is een string) toe aan ListField, terwijl een verwijzing naar een TField wordt verwacht.
Delphi:
1
2
3
ListField := 'naam';                                  // Fout! Er wordt geen string verwacht, maar een TField
ListField := MijnDataSet.Fields[0];                   // Goed. Fields[0] is een TField
ListField := MijnDataSet.FieldByName('MijnVeldnaam'); // Ook goed, alweer een TField
Voor ListSource en KeyField geldt hetzelfde.

[ Voor 13% gewijzigd door Tomatoman op 19-07-2005 13:41 ]

Een goede grap mag vrienden kosten.


  • ksmedts
  • Registratie: Januari 2002
  • Laatst online: 16-12-2021
@tomatoman de code die ik bij listfield en keyfield heb ingevuld die werken wel degelijk, alle codes die jij in bovenstaande post heb gezet werken niet!!!

en er wordt bij listsource geen tfield verwacht maar een tdatasource.....

@creepy ik verbaas me idd niet dat het niet gaat werken, dat geef ik ook aan in mijn post.... ik laat het alleen zo zien om duidelijk te maken wat ik wil doen, ik heb ook al in de properties van adoqzoekveld.FieldByName('zoek_tabel'). zitten bladeren, maar niks nuttigs gevonden

ik loop ze nog us door om te kijken of ik ergens overheen heb gekeken....

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:59

alienfruit

the alien you never expected

Als ik het goed begrijp wil je afhankelijk van de waarde zoek_tabel je DataSource vullen met bepaalde records?

  • ksmedts
  • Registratie: Januari 2002
  • Laatst online: 16-12-2021
ik heb een hele rits tabel objecten met daaraan gekoppeld de bij behorende datasource objecten, nu wil ik afhankelijk van de waarde die in de query adoqzoekveld wordt gevonden een gelijknamige tabel aan mij combobox knopen....

heb op mijn formulier bv de objecten projectnr (datasource), tblprojectnr(tabel)... in het veld adoqzoekveld.FieldByName('zoek_tabel').text wordt de waarde projectnr gevonden, op dat moment moet dus de listsource projectnr worden gekoppeld aan de combobox die ik aan het maken ben...

[ Voor 7% gewijzigd door ksmedts op 19-07-2005 14:18 ]


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:59

alienfruit

the alien you never expected

Nou als de waarde in query het zelfde is als de naam van je DataSource in DM, dan kan je toch mooi de Components collection/array doorlopen en vervolgens de juiste DataSource aan je Combobox hangen?

Zoiets?:
Delphi:
1
Bla.ListSource := ( FindComponent( FieldByName( 'zoek_tabel' ).Text ) as TDataSource );

[ Voor 31% gewijzigd door alienfruit op 19-07-2005 14:58 ]


  • ksmedts
  • Registratie: Januari 2002
  • Laatst online: 16-12-2021
klinkt als een briljante oplossing..... nu alleen ff kijken hoe dat ook weer moest, heb in een ver grijs verleden wel us zoiets gedaan. Ik laat het ff weten as het gelukt is :)

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:59

alienfruit

the alien you never expected

Okay, FindComponent is trouwens gewoon een TForm functie etc.

  • ksmedts
  • Registratie: Januari 2002
  • Laatst online: 16-12-2021
Ik ben toe aan vakantie :'(

Ik heb nu onderstaande code, geen foutmeldingen meer, het zoekgedeelte komt met de juiste naam terug (gecontroleerd met die showmessage helemaal onder aan..... maar m'n lookupbox is niet active te krijgen.....

Heb het nog ff geprobeerd door zelf dsprojectnr op de plaats van het zoeken te zetten en tuurlijk dit werkt weer wel.....

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  with tdblookupcombobox.Create(self) do
  begin
    Left := 50;
    Top := vartop;
    Height := 21;
    Width := 145;
    ListField := adoqzoekveld.FieldByName('zoek_veld').text;
    Keyfield := adoqzoekveld.FieldByName('zoek_veld').text;
    Listsource := (FindComponent(adoqzoekveld.FieldByName('tabel').Text) as Tdatasource);
    visible := true;
    parent := frmsearch;
    enabled :=true;
  end;
  showmessage(adoqzoekveld.FieldByName('tabel').Text);

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:59

alienfruit

the alien you never expected

Kijk eens of je component naam ook hetzelfde is als die in je FieldByName. Wat hij gaat nu gewoon opzoek of je er een TDataSource of je form is die de naam heeft van de waarde in adoqzoekveld.FieldByName('tabel').Text. Als die niet wordt gevonden gaat het natuurlijk ook niet lukken.

Trouwens je datasources heb je niet in een TDataModule staan ofzo? Want dat moet je dus [naam datamodule].FindComponent() want je moet natuurlijk wel op de juiste plek gaan zoeken, anders vindt ie het nooit :+

[ Voor 53% gewijzigd door alienfruit op 19-07-2005 16:12 ]


  • ksmedts
  • Registratie: Januari 2002
  • Laatst online: 16-12-2021
nope alles staat op dezelfde form.... en de naam van de datasource is in de tabel hetzelfde als op het formulier.... dat was het eerste wat ik gecontroleerd heb, heb het ook nog eens met een andere naam geprobeerd maar ook daar licht het niet aan....

Kun je na afloop van findcomponent vragen of er daadwerkelijk wat is gevonden????

heb nu net ff een dblookupcombobox op mijn form gezet en via dezelfde code listfield keyfield en listsource ingevuld..... het vreemde is dat deze wel actief wordt?????!

[ Voor 21% gewijzigd door ksmedts op 19-07-2005 16:26 ]


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:59

alienfruit

the alien you never expected

Hmm.. Misschien moet je de combobox nog actief zetten ofzo? Of anders de Datasource opnieuw op actief? Moet toegeven dat ik de ballen verstand heb van Databases en Delphi. Ik was meer van de componentjes maken e.d. :)

Misschien maakt de volgorde nog uit, wat als je de ListSource boven die andere twee regels zit?

Delphi:
1
2
3
4
5
6
7
8
dsSource := FindComponent( 'bla' ) as TDatsource );
if  ( dsSource <> nil ) then
begin
     jouwControl.ListSource := dsSource;
end 
else begin
   ShowMessage( 'Er ging iets goed fout tijdens het opzoeken van Bla! Stoute gebruiker, beetje de boel stuk maken he :(' );
end;

(uit het hoofd)

[ Voor 55% gewijzigd door alienfruit op 19-07-2005 16:39 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Nee, volgorde maakt niet uit en je hoeft ook niets actief te zetten. Ik zou gewoon eens gaan debuggen en kijken of je FindComponent wel wat vindt.

We adore chaos because we like to restore order - M.C. Escher


  • ksmedts
  • Registratie: Januari 2002
  • Laatst online: 16-12-2021
@alienfruit dank voor alle hulp, het wil nog niet echt gaan lukken maar ik denk dat ik maar iets anders ga verzinnen voor wat ik wilde maken....

@lordlarry findcomponent vindt wel degelijk wat daar was ik al achtergekomen zie de code van alienfruit....

Als nog iemand wat weet......

ja ikzelf...... KOEN JE BENT EEN EIKEL.....

zo doet ie ut dus....

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure Tfrmsearch.DBLookupComboBox1Click(Sender: TObject);
var vartop : integer;
    dssource : tdatasource;
begin
  vartop := strtoint(edttop.text);
  dssource := (FindComponent(adoqzoekveld.FieldByName('tabel').Text) as Tdatasource);
  with tdblookupcombobox.Create(self) do
    begin
      Left := 50;
      Top := vartop;
      Height := 21;
      Width := 145;
      ListField := adoqzoekveld.FieldByName('zoek_veld').text;
      Keyfield := adoqzoekveld.FieldByName('zoek_veld').text;
      Listsource := dssource;
      visible := true;
      parent := frmsearch;
      enabled :=true;
    end;
    edttop.text := inttostr(strtoint(edttop.Text)+24);
end;


Wat was nou het probleem!?
kijk naar de regel with tdblookup en de regel die nu daarboven staat findcomponent...... hoogstwaarschijnlijk was ie dus in de combobox naar die datasource aan het zoeken...

Iedereen harstikke bedank :)

[ Voor 65% gewijzigd door ksmedts op 20-07-2005 10:36 ]

Pagina: 1