Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Gemeinsame OnClick - Behandlung (https://www.delphipraxis.net/12834-gemeinsame-onclick-behandlung.html)

himitsu 5. Dez 2003 12:16

Re: Gemeinsame OnClick - Behandlung
 
@choose,
das hört sich ja langsam nach einem Beitag für die CodeLib an.



Zitat:

OK, [...] allerdings habe ich da auch meistens noch Code, der nicht bei allen Typen vorhanden ist, und das läßt sich ja leider nicht auf so eine Weise einbinden.
Mit diesem Satz meinte ich aber Code, der nicht mit dem Objekt selbst in Verbindung steht.

z.B. wird mal eine Prozedur oder andere Codezeilen nur abgearbeitet, wenn das Ereignis von einem Button ausgelöst wird, aber nicht, wenn es von einer CheckBox kommt ...

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

Doc F 7. Dez 2003 00:16

Re: Gemeinsame OnClick - Behandlung
 
Hi, Leute,

hier fühl ich mich wohl, ihr seid lustig !

Sorry, das ich mich jetzt erst wieder melde, hab flach gelegen.
Hier stehen ja wirklich viel tolle Sachen die einem Anregungen liefern, aber im Prinzip trifft alles nicht das, was ich eigentlich wollte, nämlich mit einem Button-Click div. andere Buttons steuern. Nehmen wir als Beispiel mal den DBNavigator, den ich nicht mag. Oder zwei identische Buttonleisten, die zwei verschieden Audioquellen steuern sollen.
Ich hab mich gerade ein wenig in Datenbanken eingearbeitet, und brauchte zwei DBNavigatoren.
Wie gestagt, die sind blöd, denn ich bin Designfreak und wollte es mir vorbehalten, wohin ich welchen Button setzte. Schön und gut, ist ja kein Problem und am Anfang hab ich auch erst mal schön für jeden Button seine eigen OnClick-Routine geschrieben und Ruck-Zuck ein ellenlangen QuälText :shock: gehabt, der meinen Augen fürchterlich missfiel und ausserdem schrecklich unübersichtlich war, deswegen meine Frage mit der einen (Na ja, bei mir sind schlussendlich dann vier geworden, der Übersichtlickkeit halber) Event-Routine.

Hier nun meine Lösung zur Diskussion (wie schon vorher geschrieben, waren gleich am Anfang von diesem Forumsbeitrag ein paar gutte Tips dabei):

Delphi-Quellcode:
const
// NavButton enabled Status

  nbNextLast    = 3; // binär 1100
  nbNewDel      = 6; //   "  0110
  nbStoreCancel = 9; //   "  1001
  nbFirstPrior  = 12; //   "  0011
  nbNoBtn       = 15; //   "  1111

  NavBtnNames : Array[1..8] of ShortString =
    ('BtnFirst', 'BtnPrior', 'BtnNext', 'BtnLast', 'BtnNew',
     'BtnStore', 'BtnCancel', 'BtnDel');

procedure TForm2.NavBtnClick(Sender: TObject);
var
  BtnAction, BtnID : String;
  BtnNr, NavGroup : Integer;
begin
  BtnAction := TSpeedButton(Sender).Hint;
  BtnID := IntToStr(TSpeedButton(Sender).Tag);
  NavGroup := StrToInt(BtnID[1]);
  BtnNr := StrToInt(BtnID[2]);
  case BtnNr of
    1    : SetNavBtn(NavGroup, nbFirstPrior, BtnNr);
    2..3 : SetNavBtn(NavGroup, nbNoBtn, BtnNr);
    4    : SetNavBtn(NavGroup, nbNextLast, BtnNr);
    5    : SetNavBtn(NavGroup, nbNewDel, BtnNr);
    6..8 : SetNavBtn(NavGroup, nbStoreCancel, BtnNr);
  end;
  DoBtnAction(NavGroup, BtnNr);
end;

function TForm2.GetComponentID(CoName : String) : Integer; // <-- Worum's mir eigentlich ging
var
  comp : TComponent;
begin
  comp := TComponent(FindComponent(CoName));
  result := comp.ComponentIndex;
end;

procedure TForm2.SetNavBtn(NavGroup, BtnState, BtnNr : Integer);
var
  comp : TComponent;
  compId, mask, i : Integer;
begin
  case BtnNr of
    1..4 : begin
             for i := 0 To 3 do
             begin
               compID := GetComponentID(NavBtnNames[i+1] +
                                          IntToStr(NavGroup));
               mask := 1 shl i;
               TSpeedButton(Components[compID]).enabled :=
                                          (BtnState AND mask) = mask;
             end;
           end;
    5..6 : begin
             for i := 0 To 3 do
             begin
               compID := GetComponentID(NavBtnNames[i+5] +
                                          IntToStr(NavGroup));
               mask := 1 shl i;
               TSpeedButton(Components[compID]).enabled :=
                                          (BtnState AND mask) = mask;
             end;
           end;
  end;
  if NavGroup = 1 then SetNavBtn(2, nbFirstPrior, 1);
end;

procedure TForm2.DoBtnAction(NavGroup, BtnNr : Integer);
begin
  case NavGroup of
    1 : ..

    // Anweisungsblock

  end;
end;
Ich hoffe, dieser lange Schrieb sprengt jetzt nicht das Forum.

Danke an alle für die Hilfe.

Doc F

[edit=Christian Seehase]Delphi-Tags korrigiert. Mfg, Christian Seehase[/edit]

Doc F 7. Dez 2003 00:19

Re: Gemeinsame OnClick - Behandlung
 
Ups, sorry, meine Formatierungen sin im Nirwana verschwunden. Keine Absicht.

Doc F

mr2 7. Dez 2003 17:58

Re: Gemeinsame OnClick - Behandlung
 
Hallo,

ich glaube für Dein Problem sind Actions am besten geeignet.
Einfach eine ActionList auf das Formular ziehen.
Dann per Doppelclick auf die ActionList den ListEditor öffnen und über den kleinen schwarzen Pfeil links oben eine neue Standardaktion einfügen. Jetz nach unten scrollen und unter der Rubrik DataSet TDataSetFirst, TDataSetNext etc. auswählen. In der Action kannst Du dann einstellen für welche DataSource die Action zuständig ist.
Anschließend einfach dem oder den entsprechenden Button(s) die Action als Action zuweisen.

Und schon hast Du erreicht was Du wolltest und das ohne eine Zeile Code zu schreiben.

mr2

Doc F 8. Dez 2003 20:55

Re: Gemeinsame OnClick - Behandlung
 
Hallo mr2,

Prima, danke für den Tipp, funzt ja prima. Na ja, wenigstens hab ich bei meinem Versuchen einiges gelernt.

Jetzt nur noch eine Frage (hoffe ich):

Da gibt es zwar Aktion DatSetInsert, aber nix für append. (Hät ich aber gerne ... :wall: )
Und ausserdem funzt des zwar für für Datenbanke, aber nicht zB. für meinen momentan auf Eis gelegt Audio-Player.

Kann ich da irgendwie Standarteinträge selbst erzeugen ? Hab mich schon drin versucht, mir ist aber noch nicht so ganz klar, was ich dazu alles brauch. (Nebenbei bemerkt, Objektvererbung is schon toll, sonst müsste man das ja kpl. neu schreiben).

Vielleicht hat da jemand für eine vom

Delphi-Quellcode:
Type
  TProgramiere = MöchtegernHobbyProgrammierer(Class)
noch ne verständliche Antwort parat.

Danke

Doc F

mr2 9. Dez 2003 20:12

Re: Gemeinsame OnClick - Behandlung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Zitat:

Zitat von Doc F
Delphi-Quellcode:
Type
  TProgramiere = MöchtegernHobbyProgrammierer(Class)

soll vermutlich
Delphi-Quellcode:
type
  TProgramierer = class(TMoechtegernHobbyProgrammierer)
bedeuten :lol:

Aber nun zu Deinem eigentlichen Problem.
Insert und Append sind prinzipiell identisch und führen nur bei Paradox oder ähnlich veralteten Datenbanken zu unterschiedlichen Ergebnissen. Du kannst natürlich trotzdem Deine eigene ActionKlasse schreiben:
Delphi-Quellcode:
type
  TDataSetAppend = class(TDataSetInsert)
  public
    procedure ExecuteTarget(Target: TObject); override;
  end;

implementation

procedure TDataSetAppend.ExecuteTarget(Target: TObject);
begin
  GetDataSet(Target).Append;
end;
Ich weiß nicht welche Erfahrungen Du bisher mit selbstgeschriebenen Komponenten hast.
Jedenfalls muss die Action in Delphi registriert werden. Im Anhang siehst Du wie das am besten gemacht wird (Datei U_MyActionsReg.pas). Das Beispiel ist für Delphi 6 und muss für Versionen darunter vermutlich angepass werden.
Einfach die Datei MyActions.dpk in Delphi öffnen und die Schaltfläche "Installieren" betätigen.
Weitere Hilfe findest Du auch in der Delphi-Hilfe unter "Komponentenentwicklung".

Viel Erfolg.

mr2

Doc F 9. Dez 2003 20:36

Re: Gemeinsame OnClick - Behandlung
 
Hallo mr2,

Super, jetzt wird programmiert, bis die (System-)Fetzen fliegen. :party:

Übrigens hattest du recht mit Paradox, aber irgendwo muß man ja anfangen. Und da ich keine Client-Server-Datenbanken zu schreiben gedenke, sondern einfach nur 'just for fun' oder zum eigenen Bedarf Programme schreibe, reicht das ja (für den Anfang). Welche Datenbank würdet ihr den für den Hausgebrauch empfehlen ?

Danke

Doc F

PS. Hab meinem PC mal ne neue Tastatur gegönnt, die vielen fehlenden Buchstaben sind ja schon
peinlich. Merke: Tastatur + Cola = Autsch!!!

mr2 15. Dez 2003 18:50

Re: Gemeinsame OnClick - Behandlung
 
Hallo,

also was die Datenbank angeht, habe ich mit Access (per ADO) angefangen, um später auf Interbase, Oracle & MS SQL-Server zu wechseln. Interbase & die MSDE (das ist die Light-Version des SQL-Servers) kann man problemlos auf dem eigenen Rechner installieren - bei Oracle ist das etwas komplizierter :)
Aber such' doch mal im Forum nach Hier im Forum suchenWelche Datenbank da findest Du jede Menge Antworten.

CU mr2


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 Uhr.
Seite 3 von 3     123   

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