[Delphi] Foutmelding bij toevoegen component + Data ophalen.

Pagina: 1
Acties:

  • F-Tim
  • Registratie: November 2003
  • Laatst online: 25-04 00:43
Hey allemaal,

ik ben bezig met een detailform generator. Deze maakt van een bepaalde tabel, van geselecteerde velden een detailform, waarop een soort navigatorbalk staat (zelfgemaakte 4 knoppen balk), labels met bijbehorende edits, van elk geselecteerd veld, en 3 knoppen (Ok, Hestel, Sluiten). De generator werkt op zich goed, hij maakt netjes een DFM en een PAS file aan welke ik dan in Delphi kan openen, en een form zie. Echter kan ik hierop niet zelf componenten toevoegen. Dit omdat ik nl. ook de gegevens uit de database wil halen, en dan meteen een werkend form heb wat uit de generator komt gerollen.

Als ik nu een component toevoeg, dan krijg ik de melding:
Error in module: Header is missing or incomplete.

Echter kan ik deze melding totaal niet terugvinden, en ik weet ook niet wat ik in de code moet aanpassen om dit te verhinderen.


Tevens zit ik met het probleem hoe ik het beste de data kan ophalen uit de database, ik weet dat ik een DataSource moet gebruiken, echter hoe ik hiermee verder aan de slag moet is me even ontgoocheld. Ik ben in ieder geval van plan om de gegevens op te halen indien bij een Record een veld voorkomt waarvan de naam hetzelfde is als de naam van een edit veld, zodoende kan ik met .Next en .Previous navigeren in de database. Is deze aanname juist? En kan dit?

Hieronder is de generator te vinden:
http://members.home.nl/tjajansen/Generator.zip
En hier de gegenereerde files:
http://members.home.nl/tjajansen/GeneratedFiles.zip

Hopelijk kan iemand me een kickstart geven in de goede richting, ik zou hem heel erg dankbaar zijn! _/-\o_

[ Voor 2% gewijzigd door F-Tim op 28-06-2005 16:50 . Reden: StrikeOut ]

Wanna play?


  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 02-01 05:18

KompjoeFriek

Statsidioot

Allereerst, hoe kom je aan zo'n verprutste DFM? vind het erg vreemd, maar er kan natuurlijk gewoon iets fout zijn gegaan :)

Als je een werkende .DFM en .PAS langs je kappotte had gelegt, kon je redelijk makkelijk zien wat er fout was, namelijk:

• In de .PAS mis je een aantal punt-komma's achter de object declaraties, en achter "unit uiDetailform".
• In de .PAS staat netjes "Detailform: TDetailform;", maar in de .DFM staat "object Dtlfrm1: TDtlfrm" :?
• Omdat je "unit uiDetailform" gebruikt, verwacht Delphi dat je files uiDetailform.dfm en uiDetailform.pas heten :)

WhatPulse! - Rosetta@Home - Docking@Home


  • F-Tim
  • Registratie: November 2003
  • Laatst online: 25-04 00:43
hehe :D

Dat eerste puntje had ik nog geeneens gezien, daar zal ik ff heen kijken nu, en waar nodig verbeteren..

Het tweede puntje, had ik idd nog ff veranderd voordat ik het uploadde, dit om te kijken of het eraan kon liggen dat ik een variabele naam hetzelfde genoemd had als de unit, miss dat dit een fout zou opleveren, echter maakte dit geen verschiluit. Maakt dus ook verschil uit, met compilen kreeg ik de fout dat ik een variabele redeclareerde, ook dat is nu gefixt

Het derde punt is idd dom, heb in de generator nl. een aantal dingen gescheiden, echter heb ik per ongeluk de benaming overgenomen naar de gegenereerde files... ook ff aanpassen.

Dan kan ik weer ff verder knutselen ;)

[ Voor 10% gewijzigd door F-Tim op 28-06-2005 17:00 ]

Wanna play?


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

Creepy

Tactical Espionage Splatterer

Hmmja.. je files zien er niet echt uit. Mocht je dit met de hand niet meer goed krijgen dan kan ik je maar 1 tip geven: Begin opnieuw.

Overigens zien we niet graag dat je files online plaatst zodat we kunnen kijken. Als jij die files in de toekomst weghaalt dan is het topic niet al te veel meer waard voor anderen. Waarschijnlijk had je zelf al kunnen zien dat de files mis zijn want er klopt echt niet zoveel van. Had je al gecheckt wat er mis was aan je files? Dat verwachten we in elk geval wel van je voordat je een topic opent.

Over je vraag hoe je het beste data kan ophalen uit een DB: Er zijn voor Delphi ladingen tutorials voor de verschillende database componenten te vinden. Welke heb je zelf al gevonden en geprobeerd?

Lees voor de volgende keer ook alvast P&W FAQ - De "quickstart" door zodat je weet wat we van een topicstart verwachten ;)

"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


  • F-Tim
  • Registratie: November 2003
  • Laatst online: 25-04 00:43
Ik heb de files inmiddels wel goed gekregen, dankzij de tips van KompjoeFriek! :D Kan nu gewoon componenten toevoegen, en zodoende dus ook wijzigingen doorvoeren ;)

Overigens had ik het ook wel in een code blok willenplaatsen, maar ik maak gebruik van meerdere units, en daarin staan nogal veel writeln statements, dus was het een HELE grote openingspost geweest. Daarom heb ik voor deze aanpak gekozen. Tevens maak ik toch niet actief gebruik van m'n webspace, dus kan het best voorkomen dat ik deze source's gedurende hele lange tijd erop laat staan. En dan was mijns inziens dit de beste oplossing.

Ik heb al gewerkt met Datasource, en met Query, echter een Query kan ik hier niet gebruiken omdat ik met SQL geen positie kan bepalen zonder dat ik een stuk data weet waar ik op moet zoeken? Zodoende kan ik ook nooit een pointer beinvloeden, en dan dus ook geen gegevens ophalen.
Dan rest dus nog de data source, op deze manier kun je de pointer van de tabel beinvloeden, en dan gewoon een veld ophalen wat dezelfde naam heeft. GetFieldByName(edt.Name) o.i.d. echter zit ik hier gedachteswijzes nog in de knup. Want het is nl. al een tijd geleden geweest dat ik dit gebruikt heb, en ik dus misschien wel wat starthulp erbij kon gebruiken.

Overigens zal ik de volgende keer de Quickstart beter doorlezen, en dan een betere topicstart maken! Akkoord? ;)

In de startpost zijn de verbeterde versies online gezet, en is het eerste stuk doorgestreept wat al verholpen is. Nu dus. Heb ook de Close knop al werkend :Y)

[ Voor 3% gewijzigd door F-Tim op 28-06-2005 17:10 ]

Wanna play?


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

Creepy

Tactical Espionage Splatterer

Ik heb geen idee wat je nu precies bedoelt maar met een query kan je perfect bepalen welke data je op wilt halen en welke niet. Ik zou zeggen: pak er eens een Delphi Database tutorial bij en ga aan de slag ;)
Met een TTable gekoppeld aan een datasource krijg je de gehele tabel binnen. Eventueel kun je dan weer een filter instellen om de juiste data op te halen.

"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


  • F-Tim
  • Registratie: November 2003
  • Laatst online: 25-04 00:43
Met een query moet je toch 1 van de gegevens weten? ;) Hoe kan ik dan naar record nr 2 in de tabel gaan als ik daar nog geen enkele gegevens van weet?

Als ik nu een TTable (overigens gewoon zonder datasource) gebruik, kan ik zeggen Table1.First, Table1.Prior, Table1.Next en Table1.Last, dan kan ik heel makkelijk navigeren door de tabel. Vandaar dat ik een TTable prefereer ;)

Overigens heb ik nu zo goed als alles werkend, alleen hij accepteert nog geen wijzigingen :S Hij voert de code wel uit, echter slaat ie het niet op in de database! Dit is de code:
code:
1
2
3
4
5
6
7
   Table1.Edit;
   Table1.FieldByName('NAME').Value := edtNAME.Text;
   Table1.FieldByName('SIZE').Value := edtSIZE.Text;
   Table1.FieldByName('WEIGHT').Value := edtWEIGHT.Text;
   Table1.FieldByName('AREA').Value := edtAREA.Text;
   Table1.FieldByName('BMP').Value := edtBMP.Text;
   Table1.Post;

Dit zou toch gewoon moeten werken? :/

Ik doe overigens Table1.Open bij de FormCreate, en Table1.Close bij de Sluitknop dus de tabel is wel gewoon open, en wordt op het einde ook netjes gesloten

Wanna play?


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 09:25

Tomatoman

Fulltime prutser

F-Tim schreef op dinsdag 28 juni 2005 @ 18:24:
Met een query moet je toch 1 van de gegevens weten? ;) Hoe kan ik dan naar record nr 2 in de tabel gaan als ik daar nog geen enkele gegevens van weet?
Als je geen gegevens 'weet' van record 2 valt er ook weinig te tonen in een formulier, nietwaar? Met andere woorden: ik begrijp niet wat je bedoelt.
Als ik nu een TTable (overigens gewoon zonder datasource) gebruik, kan ik zeggen Table1.First, Table1.Prior, Table1.Next en Table1.Last, dan kan ik heel makkelijk navigeren door de tabel. Vandaar dat ik een TTable prefereer ;)
Een TDataSource kan nooit werken zonder een TDataSet (TTable, TQuery etcetera). Ik denk dat je je handboek nog eens goed door moet lezen, want je mist hier wat fundamentele kennis over hoe databasecomponenten werken.
Overigens heb ik nu zo goed als alles werkend, alleen hij accepteert nog geen wijzigingen :S Hij voert de code wel uit, echter slaat ie het niet op in de database!
Mijn eerste gok is dat je ergens een fundamentele denkfout maakt. Mijn tweede gok is dat de gegevens wel degelijk worden weggeschreven, maar dat je iets anders verkeerd doet. Mijn derde gok is dat een deel van je code helemaal niet wordt aangeroepen.

Een goede grap mag vrienden kosten.


  • F-Tim
  • Registratie: November 2003
  • Laatst online: 25-04 00:43
Betere uitleg. Ik moet van een onbekende tabel een detailform maken. De tabel wordt in realtime geselecteerd. Alle beschikbare tabellen worden middels een session variabele in een combobox gezet. Indien je een tabel selecteert komen in een CheckListBox alIe beschikbare velden van die tabel te staan. Deze worden ook middels de Session variabele opgehaald. Indien jij de detailform generator dus bij jou op de pc zou draaien, komt er een werkend form uit, en weet IK niet wat de inhoud van jouw tabellen zijn.

En ik kan niet tegen SQL zeggen dat ik de data van record 2 wil. Of dat ik naar het eerste of het laatste wil. Misschien dat het wel kan, ik heb er echter onvoldoende kennis voor ;)

Een TDataSource kun je niet gebruiken zonder een TDataSet component, echter andersom werkt het wel. Een TTable ZONDER TDataSource kun je gewoon gebruiken. En als je me niet gelooft probeer je het maar ;) Be surprised.

Wat betreft het gokken:
1ste gok - Zou best kunnen, maar wáár maak ik die dan?
2de gok - De gegevens worden níet weggeschreven, als ik nl. naar het volgende record ga, en dan weer terug naar het "gewijzigde" record, dan zie ik nog altijd de originele gegevens.
3de gok - De code wordt wel degelijk aangeroepen. Indien ik nl. een breakpoint zet bij de 1ste code regel, gaat hij netjes alle regels af.

Hopelijk heb ik zo wat opheldering verschaft

[ Voor 16% gewijzigd door F-Tim op 28-06-2005 19:36 ]

Wanna play?


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

Creepy

Tactical Espionage Splatterer

Ik denk dat Tomatoman ook wel weet dat je een TTable zonder TDatasource kan gebruiken.

Als je een TTable hebt, dan moet je voor de gein eens kijken naar de propertie Fields en Fielddefs. (dit doe ik uit m'n hoofd maar je kan prima de Delphi help er zelf op na slaan..) en be surprised yourself ;)
Je weet dan alle fields die er zijn en dus kan je prima een update query gaan samenstellen. Je zou ook eens kunnen kijken of je de data "live" kan openen (again: zie de Delphi help) dan kan je zeer waarschijnlijk wel de tabel updaten. Of kijk eens naar .applyupdates als de table gecached is.

Overigens: bestaat je gehele tabel uit string velden? Je kent nu strings toe aan de .value's. Dit zou wel eens mis kunnen gaan als 1 van de velden in je tabel van het type integer is ;)

[ Voor 20% gewijzigd door Creepy op 28-06-2005 20:04 ]

"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


  • F-Tim
  • Registratie: November 2003
  • Laatst online: 25-04 00:43
.Value zorgt voor een conversie naar het juiste formaat ;) Daarom hoef ik me daar ook niet druk om te maken, en kan ik idd een string aan een integer toekennen. .Value handelt de conversie dan voor me af. En nee, de tabel bestaat dus niet alleen uit strings ;) ook integers en anderen.

Dat het overigens niet netjes is om een TTable zonder TDatasource te gebruiken ok, dat is een andere discussie. Overigens als ik in de gegenereerde code op Fielddefs klik, is deze compleet leeg. Waarschijnlijk dat het wel zal werken als je een Datasource gebruikt, maar omdat ik daar geen gebruik van maak werkt het wellicht niet.

Ik ben er inmiddels achter gekomen dat de code wel werkt.
Het blijkt alleen niet te werken op een tabel die de extensie .dbf heeft, een tabel met de extensie .db werkt wel gewoon.

Overigens kan ik nog altijd geen SQL update Query samenstellen, indien nl. ALLE data op het form gewijzigd wordt, heb ik geen referentiedata meer ;)

Edit:
en in de startpost is nu de werkende Detailform generator gemaakt ;)

[ Voor 7% gewijzigd door F-Tim op 28-06-2005 20:16 ]

Wanna play?

Pagina: 1