Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism Mein Programmierstyl (https://www.delphipraxis.net/67585-mein-programmierstyl.html)

Khabarakh 19. Apr 2006 09:32

Re: Mein Programmierstyl
 
Die Pascal-Fehler sind wohl langsam abgegrast, jetzt kommt .Net an die Reihe :twisted: :mrgreen: .
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Borland.Vcl.Menus, System.ComponentModel, Borland.Vcl.XPMan,
  Borland.Vcl.ComCtrls, Borland.Vcl.StdCtrls, System.Xml.Serialization,
  System.IO, Borland.Vcl.ExtCtrls, Borland.Vcl.StrUtils, IdBaseComponent,
  IdComponent, IdTCPServer;
Puh... Solange du nicht gerade eine große bestehende Anwendung auf .Net übertragen willst (was ich nicht glaube), solltest du die Finger von diesem VCL.Net-Zeugs nehmen. Die Dateigröße wirds dir danken, Mono ebenfalls, ich will gar nicht wissen, wie viele versteckte P/Invokes und andere Artefakte darin lauern und verspreche dir, dass du für jede einzelne Klasse der RTL/VCL ein Äquivalent in der FCL finden wirst, das zudem meistens auch noch objektorientierter ist.

Delphi-Quellcode:
type
  TDialogType = (dtOpen, dtSave);
Den T-Präfix darfst du ab nun reinen Gewissens wegsperren. Ein Enum-Präfix ist ungewöhnlich und in anderen .Net-Dialekten überflüssig, aber da diese mit Delphi.Net wohl weiterhin mit
Delphi-Quellcode:
dtOpen
statt mit
Delphi-Quellcode:
DialogType.Open
angesprochen werden können, kann man das wohl gelten lassen.

Delphi-Quellcode:
Tserver_mainform_form = class(TForm)
    MainMenu1: TMainMenu;
    geg1: TMenuItem;
    Beenden1: TMenuItem;
    Einstellungen1: TMenuItem;
    [...]
Erstmal durch ein Winform ersetzen, dann die entsprechenden Framework-Komponenten benutzen.

Delphi-Quellcode:
  TProfilDetails = class
  public
    Name: String;
  end;
Ein öffentliches Feld? Das ist sowhl in unmanaged als auch managed Code pöse ;) .

Delphi-Quellcode:
var
  server_mainform_form: Tserver_mainform_form;
  Profil: TProfil;
  TcpServerPreferences: TTcpServerPreferences;
  Log: TLog;
  ServerBefehle: TServerBefehle;
Dito. entweder in die Mainform oder eine statische Klasse.

Delphi-Quellcode:
resourcestring
Ich weiß nicht, was der Compiler damit macht, aber es ist auf jeden Fall veraltet. Dafür gibt es Resourcendateien und die ResourceManager-Klasse.

Delphi-Quellcode:
Sender.Lines.Add(timetostr(now) + ' : ' + TextMessage);
Wie Robert schon sagte: Format. Ohne VCL.Net ist es dann Delphi-Referenz durchsuchenString.Format.

Delphi-Quellcode:
TLog = class
  private
    procedure ClearLog(Sender: TMemo);
    procedure AddMessageToLog(Sender: TMemo; TextMessage: string);
  end;
  TServerBefehle = class
  private
    procedure StopServer;
  end;
Da die Klassen keine Felder besitzen, nimm Klassenmethoden. Allerdings würde ich eher die Log-Klasse den Log verwalten lassen, z.B. in einer StringCollection. Dazu noch eine Methode zum Ausgeben in eine TextBox.

Delphi-Quellcode:
for i := 0 to length(TcpServerPreferences.Bindings) - 1 do
Verabschiede dich von diesen hässlichen for-Schleifen, es gibt nun for-in-Schleifen :D .

Delphi-Quellcode:
.Free;
Du willst massenweise Objekte freigeben, die überhaupt nicht IDisposable einbinden, was soll da passieren?
Garbage Collection

Delphi-Quellcode:
if FileExists(AFilename) = False then
Delphi-Quellcode:
if not File.Exists(aFileName) then
Delphi-Quellcode:
RightStr(AFilename, 4)
String.SubString bzw. Path.GetExtension

Delphi-Quellcode:
function Tserver_mainform_form.CopyFile(AFileFrom: string; AFileTo: string): boolean;
File.Copy

Die restlichen Ersetzungen von VCL-Klassen/Prozeduren liste ich nicht auf, die kannst du mithilfe des SDKs selbst ziemlich schnell korrigieren.

Sidorion 19. Apr 2006 09:47

Re: Mein Programmierstyl
 
Hab noch einen:
Delphi-Quellcode:
  if fileExists(ExtractFilePath(ParamStr(0)) + '\FDS_Server_profiles.xml') = True then
besser:
Delphi-Quellcode:
 if FileExists(IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0)))+'FDS_Server_profiles.xml') Then
Ist a) Plattformunabhängig und b) falls irgendwann doch die Methode 'ExtractFilePath' den '\' dranhängen lässt (spätere Delphi Version) hast Du sonst zwei '\' unddannhängterisichauf :angel: .

Robert Marquardt 19. Apr 2006 10:01

Re: Mein Programmierstyl
 
Noch besser diesen Zusammenbau eines programmspezifischen Pfades in eine Methode auslagern.
ProfilePathName und PreferencesPathName oder aehnliche Namen.
Das sollte man selbst dann machen wenn man die Methode nur einmal benutzt. Indem man das Programm aus solchen genau spezifizierten Elementen zusammenfuegt, bleibt es naemlich les- und wartbar. In diesem Fall hat ein Copy & Paste Code einen Namen bekommen und man versteht was der Code macht, anstatt das man das jedesmal aufs neue herausbekommen muss.

Khabarakh 19. Apr 2006 10:10

Re: Mein Programmierstyl
 
Zitat:

Zitat von Sidorion
Hab noch einen:
Delphi-Quellcode:
  if fileExists(ExtractFilePath(ParamStr(0)) + '\FDS_Server_profiles.xml') = True then
besser:
Delphi-Quellcode:
 if FileExists(IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0)))+'FDS_Server_profiles.xml') Then
Ist a) Plattformunabhängig und b) falls irgendwann doch die Methode 'ExtractFilePath' den '\' dranhängen lässt (spätere Delphi Version) hast Du sonst zwei '\' unddannhängterisichauf :angel: .

Besser:
Path.Combine :zwinker:

[edit]Und dazu noch Roberts Anmerkung, dann ist es perfekt :mrgreen: [/edit]

Martin W 19. Apr 2006 13:11

Re: Mein Programmierstyl
 
@ Robert Marquardt ::

Zitat:

Deshalb sollte man den Konstruktor und Destruktor der Komponente/Form ueberschreiben und dort die Objekte erstellen bzw. loeschen.
Kannst du mir mal ein Beispiel anhand von Quellcode geben? Meinst du damit die Eigenschaften "On CLose" und "On Create"


@ Khabarakh ::

Zitat:

Du willst massenweise Objekte freigeben, die überhaupt nicht IDisposable einbinden, was soll da passieren?
---> Kurz gesagt, ich brauche sie gar nicht freigeben... geht alleine ?

Zitat:

Die Dateigröße wirds dir danken, Mono ebenfalls, ich will gar nicht wissen, wie viele versteckte P/Invokes und andere Artefakte darin lauern und verspreche dir, dass du für jede einzelne Klasse der RTL/VCL ein Äquivalent in der FCL finden wirst, das zudem meistens auch noch objektorientierter ist.
---> Und wie sorge ich dafür das ein Label in einer WinForms.net Anwendung Transparent wird?


Ich bin gerade dabei alles schön von VCL auf ne WinForm.net Anwendung zu übertragen... :-| Wenn ich alles fertig hab, poste ich dann mal ne aktualisierte Version davon, inklusive des kompletten Source Codes und der Anwendung :-)

Gruß
Martin W :-)

Robert Marquardt 19. Apr 2006 13:18

Re: Mein Programmierstyl
 
Zitat:

Zitat von Martin W
@ Robert Marquardt ::
Kannst du mir mal ein Beispiel anhand von Quellcode geben? Meinst du damit die Eigenschaften "On CLose" und "On Create"

Besser OnCreate und OnDestroy.
Create und Destroy der Form zu ueberschreiben ist auch moeglich. Da geht es aber nur um die Sicht der Dinge.
Ich sehe es als eine neue Komponente bei der man besser Create und Destory ueberschreibt.
Die normale Sicht ist aber eben OnCreate und OnDestroy zu verwenden.

Khabarakh 19. Apr 2006 13:43

Re: Mein Programmierstyl
 
Zitat:

Zitat von Martin W
@ Khabarakh ::

Zitat:

Du willst massenweise Objekte freigeben, die überhaupt nicht IDisposable einbinden, was soll da passieren?
---> Kurz gesagt, ich brauche sie gar nicht freigeben... geht alleine ?

Kurz gesagt, ja ;) . Wenn sie aber IDisposeable implementieren, solltest du unbedingt Dispose aufrufen.

Zitat:

---> Und wie sorge ich dafür das ein Label in einer WinForms.net Anwendung Transparent wird?
Delphi-Quellcode:
Label.BackColor := Color.Transparent;
;)

Martin W 19. Apr 2006 15:51

Re: Mein Programmierstyl
 
Hey das Forum hier ist echt genial... Danke schon mal an alle mir geholfen haben !!!

Ich überlege gerade ein Gemeinschaftsprojekt aus meinem Programm zu machen... ich lasse es euch wissen :-)


Gruß
Martin W.

Martin W 19. Apr 2006 15:56

Re: Mein Programmierstyl
 
Zitat:

Zitat von Khabarakh
Zitat:

Zitat von Martin W
@ Khabarakh ::

Zitat:

Du willst massenweise Objekte freigeben, die überhaupt nicht IDisposable einbinden, was soll da passieren?
---> Kurz gesagt, ich brauche sie gar nicht freigeben... geht alleine ?

Kurz gesagt, ja ;) . Wenn sie aber IDisposeable implementieren, solltest du unbedingt Dispose aufrufen.

Zitat:

---> Und wie sorge ich dafür das ein Label in einer WinForms.net Anwendung Transparent wird?
Delphi-Quellcode:
Label.BackColor := Color.Transparent;
;)

Dann übernimmmt er die Farbe der Form... wenn z.B. noch ein Bild auf der Form ist wird dieses ignoriert...

Khabarakh 19. Apr 2006 16:00

Re: Mein Programmierstyl
 
BackColor wird mit der Grafik des Parents geblendet. Weise also dem Label die PictureBox als Parent zu.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:13 Uhr.
Seite 2 von 3     12 3      

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