Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Abfrage scheint nicht zu funktionieren (https://www.delphipraxis.net/192226-abfrage-scheint-nicht-zu-funktionieren.html)

Delbor 30. Mär 2017 16:15

Delphi-Version: XE8

Abfrage scheint nicht zu funktionieren
 
Hi zusammen
Ich habe folgendes Konsttrukt:
Delphi-Quellcode:
    if CmbxCategorys.Items.Objects[0] <> nil then
      ApplicationManager.CategoryKey := Integer(CmbxCategorys.Items.Objects[0]);
Der Sinn ist, den (lesenden) Zugriff auf die Compobox nur zuzulassen, wenn da auch wirklich was drinsteht, weil es sonst eine AV gibt - aber genau diese gibt es (Listenindex ausserhalb...).
Wieso das? Abfragen, ob ein Objekt nil ist, laufen sonst meiner Erinnerung nach immer ohne AV durch...

Etwas nachdenken bringt oft "Wunder", und so habe ich die Zeilen etwas abgeändert:
Delphi-Quellcode:
    if CmbxCategorys.Items.Count > 0 then
    begin
      ApplicationManager.Category := CmbxCategorys.Items[0];
      if CmbxCategorys.Items.Objects[0] <> nil then
        ApplicationManager.CategoryKey := Integer(CmbxCategorys.Items.Objects[0]);
    end;
In dieser Compobox werden die in der DB vorhandenen Kategorien mit ihren Primärschlüsselwerten aufgelistet, sofern die entsprechende Tabelle auch solche enthält.
Das ist um Beispiel beim ersten Programmstart nicht so.

Trotzdem erstaunt mich die Reaktion - grundsätzlich könnten ja items vorhandensein, die zusätzlichen Objekte aber nicht...

Des weiteren könnte ein Programm - wie meines zum Bleistift - eine Auswahlbox zur Verfügung stellen, die erstmal leer ist und erst im weiteren Programmverlauf mit Daten gefüllt wird.

Gruss
Delbor

p80286 31. Mär 2017 11:22

AW: Abfrage scheint nicht zu funktionieren
 
Zitat:

Zitat von Delbor (Beitrag 1366012)
Trotzdem erstaunt mich die Reaktion - grundsätzlich könnten ja items vorhandensein, die zusätzlichen Objekte aber nicht...

Welche Objekte?
nach meinem Kenntnisstand gibt es diese erst in der
Delphi-Quellcode:
TStringlist
. Die Items aus der
Delphi-Quellcode:
TCombobox
sind noch
Delphi-Quellcode:
Tstrings
.

Gruß
K-H

Delbor 31. Mär 2017 11:44

AW: Abfrage scheint nicht zu funktionieren
 
Hi p80286
Zitat:

Welche Objekte?
Integer- oder Stringwerte zum Bleistift. Das hat so auf meiner alten Kiste funktioniert - natürlich bis auf die Sache mit dem Erststart, da die DB zu diesem Zeitpunkt noch keine Kategorien enthält.

Wenn ich das und das richtig interpretiere, haben die beiden gerade mal TPersistent in ihrer Ahnengallerie, während die Items in TListbox&Co TStrings-Objekte sind.
Objekte werden bereits bei TStrings eingeführt

Aber danke für deinen Beitrag; der hat dazu geführt, dass ich mir wieder mal etwas Grundlagen repetiert habe! :)

Gruss
Delbor

SebastianZ 31. Mär 2017 11:49

AW: Abfrage scheint nicht zu funktionieren
 
So, noch mal zum mitdenken:
Du hast eine Combobox an deren Items du irgendwelche Instanzen hängst.
Später läufst du die Items dann durch und gibst irgend einem ApplikationsManager irgendeinen CategoryKey?

Ein paar Fragen:
Zitat:

Der Sinn ist, den (lesenden) Zugriff auf die Compobox nur zuzulassen, wenn da auch wirklich was drinsteht, weil es sonst eine AV gibt - aber genau diese gibt es (Listenindex ausserhalb...).
Wenn was drinnen steht, ein Text oder ein Objekt?
Soll das Item, das kein Objekt hat nicht auswählbar sein, Liste entfernt werden, oder auswählbar sein, nur ohne AV?
Falls ersteres: warum werden Items ohne Objekt überhaupt in die Liste genommen?

Generell habe ich das Gefühl, dass hier eine etwas unglückliche Herangehensweise gewählt wurde.

Zitat:

Zitat von Delbor (Beitrag 1366055)
Hi p80286
Zitat:

Welche Objekte?
Integer- oder Stringwerte zum Bleistift. Das hat so auf meiner alten Kiste funktioniert - natürlich bis auf die Sache mit dem Erststart, da die DB zu diesem Zeitpunkt noch keine Kategorien enthält.

Gruss
Delbor

Integers und Strings sind keine Objekte.

DeddyH 31. Mär 2017 11:52

AW: Abfrage scheint nicht zu funktionieren
 
Zitat:

Zitat von p80286 (Beitrag 1366054)
Die Items aus der
Delphi-Quellcode:
TCombobox
sind noch
Delphi-Quellcode:
Tstrings

Es sind TComboBoxStrings, abgeleitet von TCustomComboBoxStrings, wiederum abgeleitet von TStrings ;)

p80286 31. Mär 2017 12:24

AW: Abfrage scheint nicht zu funktionieren
 
Zitat:

Zitat von DeddyH (Beitrag 1366057)
Zitat:

Zitat von p80286 (Beitrag 1366054)
Die Items aus der
Delphi-Quellcode:
TCombobox
sind noch
Delphi-Quellcode:
Tstrings

Es sind TComboBoxStrings, abgeleitet von TCustomComboBoxStrings, wiederum abgeleitet von TStrings ;)

Danke! ich bin über
Zitat:

Wenn der Eigenschaft Objects eines TStrings-Objekts ein Wert zugewiesen wird, hat dies keinen Effekt. Entsprechend wird beim Lesen nil (Delphi) bzw. NULL (C++) zurückgegeben. Erst die Nachkommen dieser Klasse können einzelnen Strings mit Hilfe der Eigenschaft Objects Objekte zuordnen.
gestolpert.

Gruß
K-H

himitsu 31. Mär 2017 12:56

AW: Abfrage scheint nicht zu funktionieren
 
Zitat:

Zitat von DeddyH (Beitrag 1366057)
Erst die Nachkommen dieser Klasse können einzelnen Strings mit Hilfe der Eigenschaft Objects Objekte zuordnen.

"können" ist dabei wichtig.

Die TListBox verwaltet ihre "Strings", ähhhh Items, einzeln und es wird angeboten zu Jedem ein Objects zu hinterlegen.
Das TMemo verwaltet seine Strings als einen String und hat keinerlei Speicher zu den Zeilen für die Objects.

Gut, man könnte auch eine Exception werfen, wenn jemand versucht dem Object was zuzuweisen, es aber nicht unterstützt wird, anstatt die Operation stillschweigend nichts machen zu lassen.

DeddyH 31. Mär 2017 12:58

AW: Abfrage scheint nicht zu funktionieren
 
Das hab ich nie geschrieben... Lügenpresse :mrgreen:

Delbor 31. Mär 2017 13:06

AW: Abfrage scheint nicht zu funktionieren
 
Hi zusammen

@SebastianZ:
Zitat:

So, noch mal zum mitdenken:
Du hast eine Combobox an deren Items du irgendwelche Instanzen hängst.
Genau genommen speichere ich einen Datensatz aus einer Abfrage meiner Kategorientabelle, bzw. aus dem Query, das diese abfragt, in einem eigenen Object.
Grundsätzlich erstreckt sich der komplette Datensatz eigentlich über 12 Tabellen, hier aber nur gerade auf die eine, und die hat auch nur 2 Felder: den Primarykey und einen String.
Der String wird dem CMbx.Item zugewiesen, der PK dem Cmbx.items.Objects.
Zitat:

Wenn was drinnen steht, ein Text oder ein Objekt?
Irgendwo da setzte mein Denkfehler ein: Es ist nicht möglich, dass ein Objekt drin steht ohne ein Item als 'Parent' (Das Object ist ein Property des Item-Objects).
Zitat:

Soll das Item, das kein Objekt hat nicht auswählbar sein, Liste entfernt werden, oder auswählbar sein, nur ohne AV?
Falls ersteres: warum werden Items ohne Objekt überhaupt in die Liste genommen?
Grundsätzlich sollte jeder der aus der erwähnten DB-Abfrage stammenden Datensätze :
  • Den Stringwert einem Item und den
  • PK-Wert einem Items.Objects zugewiesen werden
  • Items ohne zugehöriges Object kann/sollte es in diesem Falle nicht geben
Zur Verdeutlichung die Abfrage:
Delphi-Quellcode:
procedure TFDMySQLDml.SelectCategoryRecords;
  var SQLString: String; Zero: Boolean;
      QueryCategory : TQueryResultClass; LCategory : String; LCategoryKey : Integer;
begin
  if FCategoryList.Count>0 then
     FCategoryList.Clear;
  if assigned(FOnStartCategoryQuery) then
  begin
     Zero := True;
     FOnStartCategoryQuery(Self, Zero); //<=Der Empfänger dieses Ereignisses leert die Combobox
  end;
  FDMySQLQueryInfo.SQL.Clear;

  SQLString := 'SELECT Kath_ID as Kath_ID, Kategorie as Kategorie FROM contentmasterdata.kategorien_tabelle';
  FDMySQLQueryInfo.Open(SQLString);     //<==Kategorientabelle wird nicht gefunden ``  ` `   ``        UTF8
  FDMySQLQueryInfo.First;
  while not FDQueryMain.Eof do                      //TFDMySQLDml-Klasse
  begin
    QueryCategory := TQueryResultClass.Create(Self);
    QueryCategory.KategoryTabelle.Kath_Id := FDMySQLQueryInfo.FieldByName('Kath_ID').AsInteger;
    QueryCategory.KategoryTabelle.Kategory := UTF8ToUnicodeString(FDMySQLQueryInfo.FieldByName('Kategorie').AsString);
    FCategoryList.Add(QueryCategory);
    if assigned(FOnFoundedCategory) then
    begin
      LCategory := QueryCategory.KategoryTabelle.Kategory;
      LCategoryKey := QueryCategory.KategoryTabelle.Kath_Id;
      FOnFoundedCategory(Self,LCategory,LCategoryKey);
    end;
    FDMySQLQueryInfo.Next;
  end;
//    CM_First.CmbxFrame1.ComboBox1.Items.Add(FCategoryList.CurrentRecord.KategoryTabelle.Kategory);
  FDMySQLQueryInfo.SQL.Clear;
  FDMySQLQueryInfo.Close;
end;
Der Empfänger:
Delphi-Quellcode:
procedure TCM_First.DoOnFoundedCategory(Sender: TObject;
  const Category: String; const CategoryKey : Integer);
begin
  CmbxFrame1.ComboBox1.Items.Add(Category);
  CmbxFrame1.CmbxCategorys.Items.AddObject(Category,TObject(CategoryKey));  <===
  Application.ProcessMessages;
end;
Mein (Flüchtigkeits-)Fehler war, dass ich ursprünglich nur prüfte, ob das Objekt vorhanden ist, bevor ich es einem andern Object zuwies - es hätte gereicht, das Item aauf vorhandensein zu prüfen. Denn ohne Item auch kein Items.Objekt...

Gruss
Delbor

DeddyH 31. Mär 2017 14:07

AW: Abfrage scheint nicht zu funktionieren
 
Ich verstehe Deinen Code nicht einmal zur Hälfte, allein schon die Tatsache, dass Du Eof von FDQueryMain abfragst, dann aber durch FDMySQLQueryInfo interierst, lässt mir das Hirn einfrieren. Es scheint so, als versuchtest Du DataBinding oder gar ORM selbst zu stricken. Wären da nicht z.B. Aurelius oder EntityDAC einen Blick wert? Von beiden gibt es auch kostenlose Express-Editionen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:05 Uhr.
Seite 1 von 2  1 2      

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