Delphi-PRAXiS

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)

HolgerCW 19. Mai 2021 16:19

Delphi-Version: XE7

RecNo gibt ergibt immer -1
 
Hallo zusammen,

ich versuche im MouseUp Ereignis die Zeilennummer zu speichern:

var

Grd: TDBGrid;
FirstPosMouse: Integer;

begin
FirstPosMouse := Grd.DataSource.DataSet.RecNo;

RecNo liefert aber immer -1 ? Warum ? Was braucht Ihr noch für Infos ?

Gruss

Holger

Folgenden Code will ich zum laufen bringen: (Beim DBGrid durch Shift+Mouseklick einen Bereich markieren)

Code:
procedure TFormT.DBG_UWMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  LastPos: Integer;
  TempBookmark: Integer;
  Grd: TDBGrid;
begin


 Grd := TDBGrid(Sender);

  if (Shift = [ssShift]) and (Button = mbLeft) and (dgMultiSelect in Grd .Options) and (FirstPosMouse > 0) then
  begin

   LastPos := Grd.DataSource.DataSet.RecNo;

   with Grd.DataSource.DataSet do
   begin

    DisableControls;
    Grd.DataSource.DataSet.MoveBy(FirstPosMouse - LastPos);

    repeat

     Grd.SelectedRows.CurrentRowSelected := True;
     if (FirstPosMouse < LastPos) then
      Next
     else
      Prior;

     TempBookmark := Grd.DataSource.DataSet.RecNo;

    until (TempBookmark = LastPos);

     EnableControls;

    end;

  end
  else

  FirstPosMouse := Grd.DataSource.DataSet.RecNo;
 
end;

Uwe Raabe 19. Mai 2021 16:25

AW: RecNo gibt ergibt immer -1
 
Unterstützt denn das verwendete DataSet überhaupt RecNo?

Data.DB.TDataSet.RecNo
Zitat:

As implemented in TDataSet, the value of RecNo is always -1.
...
RecNo defines a property for derived datasets that support record numbers.

HolgerCW 20. Mai 2021 07:42

AW: RecNo gibt ergibt immer -1
 
Hallo,

das habe ich mir auch schon irgendwie gedacht.

Ich nutze TDataSource und daran TQuery

Gibt es eine andere Möglichkeit um den Code zum laufen zu bekommen ?

Gruss

Holger

Jasocul 20. Mai 2021 07:53

AW: RecNo gibt ergibt immer -1
 
Zitat:

Zitat von HolgerCW (Beitrag 1489814)
Gibt es eine andere Möglichkeit um den Code zum laufen zu bekommen ?

Indem du echte Bookmarks verwendest. Es gibt den Typ TBookmark. Der Umgang damit ist sehr einfach. Da sollte dir ein Blick in die Delphi-Hilfe genügen.
Hier ein Beispiel:
http://docwiki.embarcadero.com/CodeE...kmark_(Delphi)
Da wird zwar mit with gearbeitet, aber das kann man ja mal ignorieren. :wink:
Im Beispiel fehlt allerdings noch ein FreeBookmark.

hoika 20. Mai 2021 07:56

AW: RecNo gibt ergibt immer -1
 
Hallo,
Zitat:

Ich nutze TDataSource und daran TQuery
Und woran hängt die TQuery?
Das ist das entscheidende Detail.

Jasocul 20. Mai 2021 08:47

AW: RecNo gibt ergibt immer -1
 
Was hoika meint, ist die Frage nach der Datenbank, die du verwendest.

Du bekommst von einigen Datenbanken die Information RecNo und RecordCount nicht korrekt geliefert. Teilweise gar nicht. Daher auch der Wert -1.

Man kann sich mit Tricks behelfen (Calculated Fields) aber das sind auch nur krücken. Spätestens, wenn der Anwender die Sortierung verändert oder Filter setzt, geht das nach hinten los.

Kurz gesagt, auf die Info RecNo und RecordCount kannst du dich nicht verlassen, außer du nutzt eine Datenbank, von der du weißt, dass es immer funktioniert. Bei sogenannten Desktop-Datenbanken (z.B. Paradox) ist das in der Regel so.

Es gibt allerdings TDataSets, die das dann auch bei den "problematischen" Datenbanken unterstützen. Aber wenn du auf Nummer sicher gehen willst, wähle einen anderen Weg für die Lösung deines Problems.

HolgerCW 20. Mai 2021 09:17

AW: RecNo gibt ergibt immer -1
 
Ich verwende die Datenbank Oracle und an der stelle noch die BDE.

TBooksmark würde also gehen ? Kann mich da jemand etwas anstupsen und mir helfen wie ich den Codes anstatt Recno's in Bookmarks ändere, oder anders ?

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

Gruss

Holger

Jasocul 20. Mai 2021 09:34

AW: RecNo gibt ergibt immer -1
 
Ah, dein Problem ist ja was ganz anderes.
MultiSelect ist bei dir schon aktiv, aber Shift-Click, um einen Bereich zu markieren, funktioniert nicht.

Ich habe mal kurz Google bemüht und das hier gefunden:
https://stackoverflow.com/questions/...lick-in-dbgrid
oder das hier (scheint einfacher zu sein):
https://www.swissdelphicenter.ch/en/...de.php?id=1900
Ich hoffe, dass dir das weiterhilft.

Delphi.Narium 20. Mai 2021 10:05

AW: RecNo gibt ergibt immer -1
 
Also bei dem von mir verwendeten TJVDBGrid funktioniert das Markieren von Datensätzen mit Shift+Mausklick problemlos.

Shift drücken und festhalten. Mit der Maus in den ersten zu selektierenden Datensatz klicken. Shift weiterhin festhalten, den letzten zu markierenden Datensatz ansteuern und wiederum mit der Maus in den Datenssatz klicken. Shift loslassen und der Bereich zwischen diesen beiden Datensätzen wird selektiert.

Mit Strg+Mausklick kann man einzelnen Sätze markieren, sie müssen nicht hintereinanderliegen. Markiert wird jeder angeklickte Datensatz, solange Strg gedrückt bleibt.

Klickt man nach dem Loslassen von Shift bzw. Strg, so wird die Selektierung aufgehoben.
Zitat:

Zitat von Delphi 7 - Hilfe zu TDBGrid
SelectedRows hat nur eine Bedeutung, wenn die Eigenschaft Options die Werte dgRowSelect und dgMultiSelect enthält.

Multiselect allein reicht da nicht zwingend aus.

Und: Die BDE unterstützt nicht bei allen Datenbank RecNo und RecordCount korrekt.
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.

newIndy 20. Mai 2021 12:17

AW: RecNo gibt ergibt immer -1
 
Hast du folgendes schon versucht?
Delphi-Quellcode:
procedure TMainForm.DBGridMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     ShowMessage(IntToStr((Sender as TDBGrid).DataSource.DataSet.RecNo));
end;

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 19:12 Uhr.

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