AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Eventprocedur bei virtuellen Objekten
Thema durchsuchen
Ansicht
Themen-Optionen

Eventprocedur bei virtuellen Objekten

Ein Thema von Ykcim · begonnen am 27. Nov 2014 · letzter Beitrag vom 27. Nov 2014
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: Eventprocedur bei virtuellen Objekten

  Alt 27. Nov 2014, 16:49
D. h. einzig die Definition ist "schuld" daran?
Ja, sehr ungewöhnlich für eine als typsicher bekannte Sprache ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#12

AW: Eventprocedur bei virtuellen Objekten

  Alt 27. Nov 2014, 16:52
D. h. einzig die Definition ist "schuld" daran?
Ja, sehr ungewöhnlich für eine als typsicher bekannte Sprache ...
Bazinga
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

AW: Eventprocedur bei virtuellen Objekten

  Alt 27. Nov 2014, 16:53
Hallo Zusammen,

ich habe es jetzt umgesetzt bekommen. Ich musste tatsächlich eine DummyKlasse erstellen und einbinden, weil zwei TMS-Klassen in ein und derselben Unit nicht vertrugen. Zwei Mal den gleichen Namen für unterschiedliche Typen...

Aber jetzt klappt es.

Danke
Patrick
Nein, muss man nicht, wenn man den Typen exakt mit Unitnamen benutzt, dann ist das Wumpe.
Delphi-Quellcode:
uses
  Foo,
  Bar;
var
  LVar1 : TFooBar; // ist Bar.TFooBar, da Bar nach Foo in den uses
  LVar2 : Foo.TFooBar;
  LVar3 : Bar.TFooBar;
  
procedure UseFooBar( Val : Foo.TFoobar ); overload;
procedure UseFooBar( Val : Bar.TFooBar ); overload;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (27. Nov 2014 um 16:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#14

AW: Eventprocedur bei virtuellen Objekten

  Alt 27. Nov 2014, 17:04
Bei Eventzeigern für Methoden kann man auch Klassen-Methoden (class procedure ) übergeben, dann braucht man zwar immernoch eine Klasse (wobei man seinen Code natürlich schön nach OOP zusammenfasst),
aber man braucht dann nicht unbedingt eine Instanz der Klasse.
$2B or not $2B
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#15

AW: Eventprocedur bei virtuellen Objekten

  Alt 27. Nov 2014, 17:16
Zitat:
Nein, muss man nicht, wenn man den Typen exakt mit Unitnamen benutzt, dann ist das Wumpe.
Und wieder etwas gelernt! Danke!

Ich habe es jetzt so gemacht:
Delphi-Quellcode:
unit TExcelExportUnit;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComObj, Grids, AdvObj, BaseGrid, Math, ShellApi,
      AdvGrid,tmsUFlxFormats, VCL.FlexCel.Core, FlexCel.XlsAdapter, FlexCel.Render,
      tmsAdvGridExcel;

type
   TExcelExport = class
      strict protected
         FExcelApp: OleVariant;
         FWorkbook: OleVariant;
         Fxls: TExcelFile;
         FAutor: string;
         FFirma: string;
         FLogo_Pfad: string; //Pfad des Logos
         FQuer_Format: boolean; //Wenn true, dann Querformat, ansonsten Hochformat
         FSeiten_Ver: integer;
         FSeiten_Hor: integer;
         FSheet: integer;
         FSheets: Integer;
         FTitel: string;
         //Das ist die Procedure, die ich zuweise.
         procedure GridExcelCellFormat(Sender: TAdvStringGrid; const GridCol,
                   GridRow, XlsCol, XlsRow: Integer; const Value: WideString;
                   var Format: tmsUFlxFormats.TFlxFormat);
      public
         procedure OpenTemp;
         procedure ShowTemp(Pfad: string);
         procedure SaveFile(SG: TAdvStringGrid; dateiname: string);
         procedure CreateXLSFile(Sheets: integer);
         procedure Basis_Design(Sheet: integer; Titel: string);
         procedure Zellen_Groesse(SG: TAdvStringGrid);
         procedure Zellen(fmt: TFlxFormat; SG: TAdvStringGrid);
         property Autor: string read FAutor write FAutor;
         property Firma: string read FFirma write FFirma;
         property Logo_Pfad: string read FLogo_Pfad write FLogo_Pfad;
         property Quer_Format: boolean read FQuer_Format write FQuer_Format;
         property Seiten_Ver: integer read FSeiten_Ver write FSeiten_Ver;
         property Seiten_Hor: integer read FSeiten_Hor write FSeiten_Hor;
         property ExcelApp: OleVariant read FExcelApp;
         property Workbook: OleVariant read FWorkbook;
         property Anzahl_Sheets: integer read FSheets write FSheets;
         property Aktives_Sheet: integer read FSheet write FSheet;
         property Sheet_Titel: string read FTitel write FTitel;
   end;

var ExportGrid: TExcelExport;

implementation

procedure TExcelExport.GridExcelCellFormat(Sender: TAdvStringGrid; const GridCol,
  GridRow, XlsCol, XlsRow: Integer; const Value: WideString;
  var Format: tmsUFlxFormats.TFlxFormat); //Hier musste ich den Typen mit dem Unitnamen ansprechen.
begin
   if (Sender as TAdvStringGrid).Cells[GridCol,0]='Mengethen
      Format.Format:='#,##0';
end;


procedure TExcelExport.SaveFile(SG: TAdvStringGrid; dateiname: string);
var fmt: TFlxFormat;
      Pfad: string;
      GridExcel: TAdvGridExcelIO;
begin
   try
      Pfad:=ExtractFilePath(ParamStr(0))+'Temp\Export'+StringReplace(DateToStr(now)+'-'+TimeToStr(now),':','-',[rfIgnoreCase, rfReplaceAll])+'.xlt';
      GridExcel:= TAdvGridExcelIO.Create(nil);
      GridExcel.AdvStringGrid:=SG;
      GridExcel.GridStartRow:=0;
      GridExcel.GridStartCol:=0;
      GridExcel.OnCellFormat:=GridExcelCellFormat; //Hier wird sie zugewiesen

      GridExcel.XLSExport(Pfad,SG.Name);
      Fxls := TXlsFile.Create(true);
      Fxls.Open(Pfad);
      DeleteFiles(Pfad);
      Basis_Design(FSheet, FTitel);
      Zellen(fmt, SG);
      if dateiname='then begin
         Fxls.Save(Pfad);
         ShowTemp(Pfad);
         DeleteFiles(Pfad);
      end
      else begin
         //Save the file as XLS
         Fxls.Save(dateiname);
      end;
  finally
      Fxls.Free;
      GridExcel.Free;
  end
end;

initialization
   ExportGrid := TExcelExport.Create;

finalization
   if ExportGrid <> nil then
      ExportGrid.Free;
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#16

AW: Eventprocedur bei virtuellen Objekten

  Alt 27. Nov 2014, 17:44
Man kann auch über die Reihenfolge der Units im Uses regeln, was verwendet wird. -> immer das der letzten Unit (wenn man keinen Namespace angibt)

Zitat:
Delphi-Quellcode:
if ExportGrid <> nil then
  ExportGrid.Free;
PS: Im Free ist bereits eine Prüfung eingebaut.
Du kannst also auch direkt das Free aufrufen.


Zitat:
Delphi-Quellcode:
try
      GridExcel:= TAdvGridExcelIO.Create(nil);
finally
      GridExcel.Free;
end
Ist dir noch nicht aufgefallen, daß dir der Delphi-Compiler hier zurecht eine Warnung um die Ohren haut?
Entweder das Crerate direkt vor dem Try, oder vorher die Variable initialisieren (GridExcel:=nil; ),
denn wenn es vor oder in dem Create knallt, dann geht das Free auf die nicht-initialisierte Variable los und es knallt womöglich nochmal-
* entweder es zerschoßt dir zufällig irgendwas Anderes
* oder eine weitere Exception im Free (meistens Zugriffsverletzung) schrottet/überdeckt dir die eigentliche Fehlermeldung
$2B or not $2B

Geändert von himitsu (27. Nov 2014 um 17:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:41 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