Datenbanken

Wie spreche ich in einem DBGrid markierte Datensätze an?

Ich habe ein TDBGrid mit dgMultiSelect Enabled. Wie frage ich jetzt ab, welche Records der User gewählt hat?

Idee:

for i := 0 to YourGrid.SelectedRows.Count-1 do begin
  if BookmarkValid (TBookmark(YourGrid.SelectedRows.Items[i])) then
   begin
     GotoBookmark (TBookmark(YourGrid.SelectedRows.Items[i]));
     {Tu_Was_Mit_Daten;}
  end;
end;

Eine einzelne Zelle in einem DBGrid selektieren

Um eine Zeile in einem DBGrid zu selektieren, muß man der Eigenschaft "SelectedField" den Klassennamen des gewünschten Feldes zuweisen:

DBGrid1.SelectedField := Table1SomeField;
DBGrid1.SetFocus;

Gelöschte Datensätze aus einer Datenbank entfernen

Das funktioniert mit folgender Routine aus der RxLib:

uses BDE;

procedure PackTable(Table: TTable);
var
  FCurProp: CurProps;
  TblDesc: CRTblDesc;
  hDb: hDbiDB;
  TablePath: array[0..dbiMaxPathLen] of Char;
  Exclusive: Boolean;
begin
  if not Table.Active then
    _DBError(SDataSetClosed);
  Check(DbiGetCursorProps(Table.Handle, FCurProp));
  if StrComp(FCurProp.szTableType, szParadox) = 0 then begin
    hDb := nil;
    FillChar(TblDesc, SizeOf(CRTblDesc), 0);
    with TblDesc do begin
      StrPCopy(szTblName, Table.TableName);
      StrCopy(szTblType, FCurProp.szTableType);
      bPack := True;
    end;
    Check(DbiGetDirectory(Table.DBHandle, False, TablePath));
    Table.Close;
    try
      Check(DbiOpenDatabase(nil, szCFGDBSTANDARD, dbiReadWrite, 
                            dbiOpenExcl, nil, 0, nil, nil, hDb));
      Check(DbiSetDirectory(hDb, TablePath));
      Check(DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, False));
      Check(DbiCloseDatabase(hDb));
    finally
      Table.Open;
    end;
  end
  else
    if StrComp(FCurProp.szTableType, szDBase) = 0 then begin
      Exclusive := Table.Exclusive;
      Table.Close;
      try
        Table.Exclusive := True;
        Table.Open;
        try
          Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, 
                nil,True));
        finally
          Table.Close;
        end;
      finally
        Table.Exclusive := Exclusive;
        Table.Open;
      end;
    end
    else
      DbiError(DBIERR_WRONGDRVTYPE);
end;

Wie kann man die Paßwort-Abfrage beim Öffnen einer Datenbank unterdrücken?

Die "Active"-Eigenschaft der TTable-Komponente muß im Objektinspektor auf "false" gesetzt werden, dann fügt man in der OnCreate-Methode des Hauptformulars folgenden Code ein:

Session.AddPassword('My secret password');
Table1.Active := true;

Wie kann man eine Paradox-Datenbank mit einem Paßwort schützen?

Diese Routine ändert das Masterpaßwort bzw. legt es an oder löscht es. AFlag bestimmt, ob es ein Paßwort geben soll oder nicht. Die Table muß dabei exclusiv geöffnet sein.

procedure ChangeMasterPassword(Tbl: TTable; const APassword:String;
                               AFlag:Boolean);
var
  hDb: hDbiDb;
  TblDesc: CRTblDesc;
  szDir : array[0..dbiMaxNameLen] of Char;
begin
  Check(DbiGetDirectory(Tbl.DBHandle, False, szDir));
  try
    FillChar(TblDesc, sizeof(CRTblDesc), #0);
    Tbl.DisableControls;
    Tbl.Close;
    Check(DbiOpenDatabase(nil, nil, dbiReadWrite, dbiOpenExcl, nil, 
          0, nil, nil, hDb));
    Check(DbiSetDirectory(hDb,szDir));
    TblDesc.bProtected:=AFlag;
    if AFlag then StrPCopy(TblDesc.szPassword,APassword);
    StrPCopy(TblDesc.szTblName, Tbl.TableName);
    StrCopy(TblDesc.szTblType, szParadox);
    Check(DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, False));
  finally
    Check(DbiCloseDatabase(hDb));
    Tbl.EnableControls;
    Tbl.Open;
  end;
end; {Peter Haas}