Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Delphi hängt sich auf mit selbstgemachten Komponenten (https://www.delphipraxis.net/47179-delphi-haengt-sich-auf-mit-selbstgemachten-komponenten.html)

Schuster 7. Jun 2005 13:56


Delphi hängt sich auf mit selbstgemachten Komponenten
 
Hallo
habe mit dem Proggen von Komponenten angefangen :-D
siehe LINK

jetzt hab ich das Problem wenn ich ein neues Projekt mit den Komponenten mach und dann auf alles schließen
klicke hängt Delphi und reagiert nicht mehr :wall:

Hat jemand eine Idee an was das liegen kann??

P.s Meine Komponenten functionieren mit den implementierten functinen bist jetzt einwandfrei.

Schuster 7. Jun 2005 14:46

Re: Delphi hängt sich auf mit selbstgemachten Komponenten
 
Ich kapier das nicht Delphi hängt sich nur auf wenn ich meine Komponenten in einem
Projekt verwende sonst nicht :wall:

Hab ich vorher vergessen

Delphi-Quellcode:
unit MaxMySqlCon;

interface

uses
  SysUtils, Classes, mysql,Dialogs;

type
  TMaxMySqlCon = class(TComponent)
  private
    { Private-Deklarationen }

    FHost : String;
    FUser: String;
    FPort: Integer;
    FPass : String;
    FDatenbank : String;

    Verbindung : Boolean;
  protected
    { Protected-Deklarationen }

  public
    { Public-Deklarationen }
    _MySql : Pmysql;
   
    function Connect():boolean;
    function disconnect():boolean;
    function Connected():boolean;

  published
    { Published-Deklarationen }
    property Host : String Read FHost Write FHost;
    property User : String Read FUser Write FUser;
    property Port : Integer Read FPort Write FPort;
    property Password : String Read FPass Write FPass;
    property DB : String Read FDatenbank Write FDatenbank;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MaxMySql', [TMaxMySqlCon]);
end;

{ ************************Verbindung aufbauen********************************}
function TMaxMySqlCon.Connect():boolean;
begin
  if Connected = false then
  begin
    _mySql:= mysql_init(nil);     //Objekt erzeugen
      if _mySql=nil then
      begin
        ShowMessage('Kann Verbindungsobjekt nicht initialisieren');
        result:= false;
        exit;
      end;
  //Verbindung herstellen
    if mysql_real_connect(_mySql,PChar(Fhost),PChar(FUser),PChar(FPass),PChar(FDatenbank), +
                        FPort,nil,0) = nil then
    begin
      result:= false;
      ShowMessage(mysql_error(_mySql));
      exit;
    end;
  Verbindung:= true;
  result:= true;
  end
  else
    result:=true; //Es besteht noch eine Verbindung (Connected=true)
end;

{ ************************noch Verbunden??********************************}
function TMaxMySqlCon.Connected():boolean;
begin
   try
   begin
      if _MySql=nil then        //Wenn Objekt nicht vorhanden raus
      begin                     // ist notwendig da sonst Exception kommt
          result:=false;
          exit;
      end;
      if Verbindung=false then     //Globale Var die in Connect und disconect gesetzt wird
      begin                        // ist notwendig da sonst Exception kommt
          result:= false;
          exit;
      end;
      if _MySql<>nil then
      begin
        if mysql_ping(_MySql)=0 then
          result:= true
        else
          result:= false;
      end
      else
        result:=false;
   end;
   except
    result:=false;
   end;
end;

{ ************************Verbindung trennen********************************}
function TMaxMySqlCon.disconnect():boolean;
begin
    if Connected then
    begin
      mysql_close(_mysql);
      Verbindung:=false;
      result:= true;
    end
    else
      result:= false;
end;
end.
Delphi-Quellcode:
unit MaxMySqlQuery;

interface

uses
  SysUtils, Classes,mysql,MaxMySqlCon, Dialogs;

type
  TMaxMySqlQuery = class(TComponent)//(TMaxMySqlCon)     //Vererbt von TMaxMySqlCon
  private
    { Private-Deklarationen }
    TSource : TMaxMySqlCon;

    SQL_Text : PChar;
    SQL_Result : PMYSQL_RES;
//    SQL_Row : PMYSQL_ROW;


  protected
    { Protected-Deklarationen }
    procedure Notification(AComponent: TComponent; Operation: TOperation);override;

  public
    { Public-Deklarationen }
    procedure Clear();
    procedure Add(SQL_String:String);
    function Open(): PMYSQL_RES;
    procedure ExecSQL();
    function RowCount():Integer;

  published
    { Published-Deklarationen }
    property Datasource : TMaxMySqlCon read TSource write TSource;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MaxMySql', [TMaxMySqlQuery]);
end;
{******************************************************************************
                  Notification überschreiben
*******************************************************************************}
procedure TMaxMySqlQuery.Notification(Acomponent : TComponent; Operation: TOperation);
begin
   if (Operation = opRemove) and (AComponent is TMaxMySqlCon) then
      TSource := nil;
end;

{******************************************************************************
                              Sql Clear
*******************************************************************************}
procedure TMaxMySqlQuery.Clear();
begin
    mysql_free_result(SQL_Result);
end;

{******************************************************************************
                            Sql Add
*******************************************************************************}
procedure TMaxMySqlQuery.Add(SQL_String:String);
begin
    SQL_Text:=PChar(SQL_String);
end;

{******************************************************************************
                            Sql Open
*******************************************************************************}
function TMaxMySqlQuery.Open(): PMYSQL_RES;
//var x : Integer;
begin
    if TSource.Connected then
    begin
    mysql_real_query(TSource._MySql,SQL_Text,length(SQL_Text));

    SQL_Result := mysql_store_result(TSource._MySql); //alle Datensätze vom Server anfordern
      if TSource._MySql = nil then
      begin
        ShowMessage('Es konnten keine Datensätze zurückgebenen werden. Ursache: ' + mysql_error(TSource._MySql));
        result:= nil;
        Exit;
      end;
    end
    else
      ShowMessage('Kann Abfrage nicht durchführen da keine Verbindung zum Server besteht');

//      x:= mysql_num_rows(Sql_Result);
    result:= SQL_Result;
end;

{******************************************************************************
                            Sql ExecSQL
*******************************************************************************}
procedure TMaxMySqlQuery.ExecSQL();
begin

end;

{******************************************************************************
                            Row Count       -1 wenn nicht verbunden
*******************************************************************************}
function TMaxMySqlQuery.RowCount():Integer;
begin
  if TSource.Connected then
     result:= mysql_num_rows(SQL_Result)
  else
    result:= -1;
end;
end.

Schuster 9. Jun 2005 16:38

Re: Delphi hängt sich auf mit selbstgemachten Komponenten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Push :stupid:

Hab hier mal meine Komponenten angehängt.
Vielleicht findet ja einer den Fehler

Taladan 9. Jun 2005 17:05

Re: Delphi hängt sich auf mit selbstgemachten Komponenten
 
Da ich keine Datenbankanbindungen machen kann, konnte ich es nicht probieren. Aber Probier mal folgendes: Schreib einen Destruktor, der die Verbindung trennt und auch alle Variablen (wieder) frei gibt.

Taladan 9. Jun 2005 17:19

Re: Delphi hängt sich auf mit selbstgemachten Komponenten
 
Und das
Delphi-Quellcode:
procedure TMaxMySqlQuery.Notification(Acomponent : TComponent; Operation: TOperation);
begin
   inherited Notification(AComponent, Operation);
   if (Operation = opRemove) and (AComponent is TMaxMySqlCon) then
      TSource := nil;
end;
Das müßte eigenlich dein Fehler sein, denn du überschreibst die Notification-Funktion Diese wird bei jeder Veränderung, alos Erzeugen oder Löschen aufgerufen. Jedoch macht deine Funktion nichts anderes als deine If-Anweisung. Die eigendliche "Veränderungsfunktion" wird nicht aufgerufen. Leider weiß ich nicht, ob die in deinen Fall vor oder nach der If-Schleife kommen muß. Könnte sein, das dies je nach Operation auch verschieden sein kann.

Gruß Marco


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 Uhr.

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