Avatar billede jackass- Nybegynder
14. september 2007 - 11:08 Der er 4 kommentarer og
1 løsning

Access violation..

Hep :)

I min applikation har jeg på FormCreate et tjek på om værdien "isconf" i win registry = "no". Hvis den er det, skal FormSettings åbnes så brugeren "tvinges" til at oprette settings første gang programmet køres.

Umiddelbart fungerer nedenstående fint og FormSettings åbnes også. Men når så man på FormSettings trykker på OK knappen (eller for den sags skyld Cancel, så crasher programmet med en access violation exception - og jeg kan sgutte finde fejlen. Dog markerer Delphi linien SaveSettings i proceduren TFormSettings. btnOKClick.. men fjerner jeg FormSettings.Close; fra SaveSettings; proceduren, får jeg ingen fejl (men så lukkes formen jo ikke :) )

Så fejlen må være ET eller andet sted i det med at åbne og lukke form og noget pointer værk nok :/

Koden ser således ud:

-------------------------

procedure TFormSettings.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:= caFree;
end;

procedure TFormSettings.FormDestroy(Sender: TObject);
begin
  FormSettings := nil;
end;

procedure TFormSettings.btnOKClick(Sender: TObject);
begin
  SaveSettings;
end;

procedure TFormSettings.btnCancelClick(Sender: TObject);
begin
  FormSettings.Close;
end;

procedure TFormSettings.SaveSettings;
begin
  with TRegistry.Create do
  try
    RootKey := HKEY_CURRENT_USER;
    // SAVE AUTOSTART SETTINGS
    if OpenKey(mDriveKeyName,true) then
      begin
        if checkAutostart.Checked then
          begin
            WriteString(mDriveValueName,Application.ExeName);
            CloseKey;
          end
        else
          if ValueExists(mDriveValueName) then
            DeleteValue(mDriveValueName);
      end
    else
      MessageDlg('Could not open Registry key for insertion.', mtError, [mbOK], 0);
    // SAVE USERNAME, PASSWORD AND DRIVE LETTER
    if OpenKey(mDriveSettingsKeyName,true) then
      begin
        WriteString('User',encrypt(txtKundenr.Text,'hejmeddig'));
        WriteString('Pw',encrypt(txtAdgangskode.Text,'hejmeddig'));
        WriteString('DriveLetter',drivesCombo.Items[drivesCombo.ItemIndex]);
        CloseKey;
      end
    else
      if CreateKey(mDriveSettingsKeyName) then
        if OpenKey(mDriveSettingsKeyName,true) then
          begin
            WriteString('User',encrypt(txtKundenr.Text,'hejmeddig'));
            WriteString('Pw',encrypt(txtAdgangskode.Text,'hejmeddig'));
            WriteString('DriveLetter',drivesCombo.Items[drivesCombo.ItemIndex]);
            CloseKey;
          end
    else
      MessageDlg('Could not open Registry key for insertion.', mtError, [mbOK], 0);
  finally
    free;
  end;

  FormSettings.Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CoolTrayIcon.IconList := nil;
  if not DiskInDrive(mGetDriveLetter[1]) then
  begin
    ImageList1.GetIcon(1, CoolTrayIcon.Icon);
    ShowMessageDiscon;
  end
  else
    ImageList1.GetIcon(0, CoolTrayIcon.Icon);
  CoolTrayIcon.CycleIcons := true;

  with TRegistry.Create do
  try
    RootKey := HKEY_CURRENT_USER;
    if OpenKey(mDriveSettingsKeyName,True) then
    begin
      if ValueExists('isconf') then
      begin
        if ReadString('isconf') = 'no' then
        begin
          showmessage('test 1');
          WriteString('isconf','yes');
          FormSettings := TFormSettings.Create(nil);
          FormSettings.Show;
        end
      end
      else
      begin
        showmessage('test 2');
        WriteString('isconf','yes');
        FormSettings := TFormSettings.Create(nil);
        FormSettings.Show;
      end;

      CloseKey;
    end;
  finally
    free;
  end;

end;
Avatar billede rocco_siffredi Nybegynder
14. september 2007 - 11:35 #1
Prøv at skrive "Close;" i stedet "FormSettings.Close;" i henholdsvis "TFormSettings.btnCancelClick" og "TFormSettings.SaveSettings".

// Rocco
Avatar billede jackass- Nybegynder
14. september 2007 - 12:02 #2
Nu spørger jeg af ren uvidenhed; hvad forskel skulle det gøre? Giver det ikke det samme? :)
Avatar billede rocco_siffredi Nybegynder
14. september 2007 - 12:17 #3
Som det er nu benytter du en variabel som muligvis ikke er initialiseret (FormSettings). Hvis den er initialiseret peger den muligvis ikke på den instans af formen benyttes.
Hvis du dropper variablen, kaldes "Close" på den instans af formen som benyttes.

// Rocco
Avatar billede hrc Mester
14. september 2007 - 12:49 #4
Det er en stor uskik at benytte den globale instansvariabel inden i klassen selv. Det er noget hø. Der findes en sikker metode der hedder self.Close.

Som rocco skriver behøver den globale variabel ikke være defineret. Den kan sagtens være nil eller noget helt tredje.

Den korrekte løsning er derfor:

procedure TFormSettings.btnCancelClick(Sender: TObject);
begin
  self.Close; // eller bare Close
end;
Avatar billede jackass- Nybegynder
16. september 2007 - 22:37 #5
Super, det spiller :)
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