17. september 2004 - 13:51Der er
25 kommentarer og 1 løsning
Updating Data in a linked table is not supported by this ISAM.
Jeg er i gang med et program, hvor jeg bruger en tekst fil som database med | som seperator. Jeg har lavet en ny Data Source i OBDC Data Source Administrator og det virker fint indtil jeg prøver at ændre noget i filen. Når jeg prøver at ændre noget får jeg denne besked: [Microsoft][ODBC Text Driver]Updating Data in a linked table is not supported by this ISAM.
Desuden skal det lige siges, at jeg prøver at ændre den ved brug af et ADODataset, en datasource og et DBGrid. Jeg kan sagtens se databasen, men bare ikke ændre.
Jeg kan desværre ikke leve med et andet format :( Medmindre man måske kunne lave en lille process, der konverterede tekst filen med | til et andet format og efter ændringerne var lavet, så kunne konvertere den tilbage igen. Nogle idéer i den retning?
Ja, Drop dit datset halløj og brug en stringlist, den har en property du kan sætte element skrille karakteren på så sætter du den til '|' og læsser din fil ind i den, så har du en liste du kan lege med rette i og gemme igen
Det er nemmeligt helt korrekt. Bare placér TStringList ved siden af Pyramiderne, Kolossen fra Rhodos, Babylons hængende haver, Alexandrias fyrtårn og alle de andre.
Er det bare en enkelt information eller er der flere slags pr. record? Hvis der er flere kan du bruge TStringLists fætter, TObjectList - men det kræver lidt mere programmering.
Undskyld, hvis det er mig, der ikke kan følge med her, men er en stringlist ikke bare en enkel liste og ikke en hel database? Jeg forstår ikke helt, hvordan jeg kan få den ind i et DBGrid.
Det kan du heller ikke, men du kan evt. vise det i en StringGrid, men det lyder som om der er flere felter per record, hvordan ser dit dataformat mere præsist ud :
Felt delimiter og record delimiter og hvor mange felter er der
et lille eks på hvordan du læser ind i en StringGrid med TStringList : Form Fil : object Form1: TForm1 Left = 230 Top = 107 Width = 870 Height = 640 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel Left = 180 Top = 20 Width = 32 Height = 13 Caption = 'Label1' end object Button1: TButton Left = 25 Top = 10 Width = 96 Height = 25 Caption = 'L'#230's fra disk' TabOrder = 0 OnClick = Button1Click end object StringGrid1: TStringGrid Left = 5 Top = 50 Width = 836 Height = 511 TabOrder = 1 end end -------------------------------- Pas fil : unit Unit1;
type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; StringGrid1: TStringGrid; procedure Button1Click(Sender: TObject); private { Private declarations } FList : TStringList; FList2 : TStringList; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); VAR Cnt : Integer; begin FList := TStringList.Create; FList2 := TStringList.Create; FList2.LoadFromFile('F:\Frandsen\data.dat'); <------- ret sti her Label1.Caption := Format('Indlæste Records : %d',[FList2.Count-1]); StringGrid1.RowCount := FList2.Count; FList.Delimiter := '|'; for Cnt := 0 to FList2.Count-1 do begin FList.DelimitedText := FList2[Cnt]; StringGrid1.ColCount := FList.Count; StringGrid1.Rows[Cnt].Assign(FList); FList.Clear; end; end;
end. ---------------------
Lav et project og overskriv dfm filen og pas filen med det ovenstående, ret derefter stien og filnavnet på den db fil du vil indlæse
Det behøver jeg faktisk i ikke de ligger som en del af form obj. og delphi rydder selv op når programmet lukker, men det er da rigtigt at hvis det skal være HELT rigtig så ...
MartinLind: Jeg er nu ikke sikker på at Delphi håndterer den slags. Det er noget med hvad der allokeres hvor og det strider i alt fald med/mod al børnelærdom ikke at ordne den slags i destructoren.
Det er rigtigt nok at hvis du laver en TRadioButton eller ligenende så angiver du en Owner i constructoren og så skulle det være i orden. Når den "konstructor" sig så hægter den sig på ejerens liste af komponenter og så skal den nok sørge for at frigive sig selv.
Din påstand har dog sået tvivl og jeg bliver nødt til at teste det. Så kan det jo være at jeg kommer med endnu et af mine dementier
Jeg lavede en form der åbnede en subform der oprettede en stringlist med 10000 linier. Da jeg lukkede formen var der fortsat 7MB allokeret til stringlisten.
Håber ikke at du har lavet det trick for mange steder i dine programmer...
martinlind: Ja, men det her er ikke Java! Det er ikke sådan man programmerer i Delphi - eller C/C++ for den sags skyld.
Og nej, dette her er ikke garbage collection (det er sløset programmering) idet GC er en mekanisme der løbende sørger for at rydde op i hukommelsen. Det er ikke hvad der sker når et program lukkes.
Når programmer afsluttes så frives al den hukommelse som tilhører det. Om det er udviklingssproget eller Windows' opgave, ved jeg ikke, men mon ikke det er Windows.
Det er i alt fald noget skidt at lære fra sig i et forum som Eksperten.
En definition:
(GC) The process by which dynamically allocated storage is reclaimed during the execution of a program. The term usually refers to automatic periodic storage reclamation by the garbage collector (part of the run-time system), as opposed to explicit code to free specific blocks of memory.
Automatic garbage collection is usually triggered during memory allocation when the amount free memory falls below some threshold or after a certain number of allocations. Normal execution is suspended and the garbage collector is run. There are many variations on this basic scheme.
Languages like Lisp represent expressions as graphs built from cells which contain pointers and data. These languages use automatic dynamic storage allocation to build expressions. During the evaluation of an expression it is necessary to reclaim space which is used by subexpressions but which is no longer pointed to by anything. This reclaimed memory is returned to the free memory pool for subsequent reallocation.
Without garbage collection the program's memory requirements would increase monotonically throughout execution, possibly exceeding system limits on virtual memory size.
The three main methods are mark-sweep garbage collection, reference counting and copying garbage collection.
See also the AI koan about garbage collection.
... så "pretty please - with sugar on top - Free the f...... objects"
Til et hurtigt Hack som det jeg lavede til ham, synes jeg altså godt jeg kan forsvare min kode, og jeg man skal da ryde op efter sig, det plejer jeg også at gøre.
Synes godt om
Ny brugerNybegynder
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.