Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi RecNo gibt ergibt immer -1 (https://www.delphipraxis.net/207950-recno-gibt-ergibt-immer-1-a.html)

Jasocul 20. Mai 2021 13:05

AW: RecNo gibt ergibt immer -1
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1489826)
Zitat:

Zitat von HolgerCW
Im Endeffekt brauche ich eine Lösung für Mausklick+Shift im DBGrid Datensätze markieren.

Das wird eigentlich vom TDBGrid (ohne jedewede weitere Programmierung) unterstützt.

Leider nicht. Ich habe das extra für TDBGrid nochmal geprüft. Bei TJVDBGrid mag das allerdings funktionieren.

Rolf Frei 20. Mai 2021 16:55

AW: RecNo gibt ergibt immer -1
 
RecNo kannst du bei den meisten (glaube sogar bei allen) SQLLink Serverdatenbanken mit der BDE nicht nutzen. Da wird die nötige Information vom Server nicht geliefert. RecNo geht nur mit lokalen DB's wie Paradox oder DBase. Was du aber machen willst, geht definitv mit Bookmarks, die du dann in einer Liste speichern und entfernen musst, je nachdem was der Anwender macht, also markieren oder Markierung löschen.

Ich bin eigentlch auch der Meinung, dass sowas in der Art bereits im TDBGrid eingebaut ist. Ich selber nutze das TDBGrid schon seit Jahren nicht mehr, da es da viel zu viele Limitierungen gibt. Eventuell solltest du auch darüber nachdenken, eventuell ein 3rd Party DBGrind zu nutzen.

HolgerCW 20. Mai 2021 16:55

AW: RecNo gibt ergibt immer -1
 
Hallo zusammen,

vielen Dank für Euren Input. nun habe ich es hinbekommen.

Zitat:

procedure TMainForm.DBGridMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ShowMessage(IntToStr((Sender as TDBGrid).DataSource.DataSet.RecNo));
end;
Das ging leider nicht

Zitat:

Das wird eigentlich vom TDBGrid (ohne jedewede weitere Programmierung) unterstützt.
Das ist nur bei dem TJVDBGrid so

So hat es geklappt:

Code:
procedure TForm1.DBG1MouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin

 if ssShift in Shift then
  SetBookMarkRange(Sender as TDBGrid,DM1.Query1);

end;

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


procedure TDM1.Query1AfterScroll(DataSet: TDataSet);
begin

 if SettingBookmarkRange then exit;

 PreviousRowID := CurrentRowID;
 CurrentRowID := DM1.Query1.FieldByName('ID').AsInteger;

end;


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

var
 SettingBookmarkRange: Boolean;
 CurrentRowID,
 PreviousRowID: Integer;

procedure SetBookmarkRange(DBGrid_Shift:TDBGrid;Query_Shift:TQuery);
var
 BM,
 TempBM : TBookmark;
 NewBM : TBookmarkStr;
 FoundPrevious : Boolean;
begin

  //  This code is called after the user does a Shift-Click in the grid
  //  First we set a flag to temporarily prevent the CurrrentRowID and
  //  PreviousrowID from being updated during the dataset's OnScroll event
  SettingBookmarkRange := True;

  BM := Query_Shift.GetBookmark;

  //  Set a flag to keep track of whether we've found the row with the PreviousRowID
  FoundPrevious := False;
  try

   Query_Shift.DisableControls;

   //  First, search forwards to see if we can find the the row with the PreviousRowID
   //  In other words, we're first checking that the Shift-Click was on a row *above*
   //  the previous row
   Query_Shift.Next;

   while not FoundPrevious and not Query_Shift.Eof do
   begin

    if Query_Shift.FieldByName('ID').AsInteger = PreviousRowID then
    begin

     FoundPrevious := True;

     //  We found the row with the PreviousRowID, so now get the Grid to add it, and
     //  all the rows back to where we started, in its SelectedRows list
     while not Query_Shift.Bof and (Query_Shift.FieldByName('ID').AsInteger <> CurrentRowID) do
     begin

      DBGrid_Shift.SelectedRows.CurrentRowSelected := True;
      Query_Shift.Prior;

     end;

    end
    else

     Query_Shift.Next;

    end;

    if not FoundPrevious then
    begin
     //  If we get here, the Shift-Click must have been in a row further down the
     //  grid than the previously-current one
     while not FoundPrevious and not Query_Shift.Bof do
     begin

      if Query_Shift.FieldByName('ID').AsInteger = PreviousRowID then
      begin

       FoundPrevious := True;
       //  We found the row with the PreviousRowID, so now get the Grid to add it, and
       //  all the rows back to where we started, in its SelectedRows list
       while not Query_Shift.Eof and (Query_Shift.FieldByName('ID').AsInteger <> CurrentRowID) do
       begin

        DBGrid_Shift.SelectedRows.CurrentRowSelected := True;
        Query_Shift.Next;

       end;

      end
      else

       Query_Shift.Prior;

      end;

    end;

  finally

   Query_Shift.GotoBookmark(BM);
   Query_Shift.FreeBookmark(BM);
   Query_Shift.EnableControls;
   SettingBookmarkRange := False;

  end;

end;
Gruss

Holger

HolgerCW 20. Mai 2021 16:58

AW: RecNo gibt ergibt immer -1
 
Rolf du hast Recht.

Das Projekt ist schon sehr alt, aber sehr groß. es wird auch bald abgelöst durch eine andere Software, aber bis dahin wird es halt noch ein wenig gepflegt und wünsche umgesetzt. ;)

Gruss

Holger

himitsu 20. Mai 2021 20:26

AW: RecNo gibt ergibt immer -1
 
Oder notfalls einfach in die Records/Datensätze eine laufende Nummer einfügen :stupid:
SQL-Code:
SELECT ROW_NUMBER() OVER () AS RecNo, ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:28 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz