Autor Beitrag
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 21.05.06 11:26 
Der Blick über den Tellerrand


In den letzten Tagen habe ich mich eingehend mit einem Produkt beschäftigt, welches meines Erachtens viel zu wenig Beachtung erhalten hat. Die Rede ist von RemObjects Chrome. Chrome ist ein Pascalcompiler, welcher sich in das Visual Studio integriert und sowohl .NET 1.1 als auch .NET 2.0 vollständig unterstützt. Außerdem bietet Chrome eine Vielzahl von Sprachfeatures, die es klar von anderen Pascaldialekten wie Delphi oder Free Pascal unterscheiden.



Meine Highlights
Ich möchte an dieser Stelle keine komplette Liste abarbeiten, das darf jeder auf der Seite des Herstellers selber tun. In diesem Artikel werde ich eine ganz subjektive Auswahl treffen. Da ich noch nicht allzu lange mit Chrome arbeite, werden das wahrscheinlich noch nicht einmal die wirklichen "Highlights" der Sprache sein.

Als Erstes möchte ich auf Dinge eingehen, die der Compiler für den Programmierer erledigt. Und davon gibt es einige. Vor allem anderen gefällt mir dabei die so genannte "Type Inference", was soviel heißt, dass der Compiler nicht nur die Typen meiner Variablen erkennt, sondern erkennt, dass ich überhaupt eine neue Variable einführen will. Letzteres gilt für Variablen mit begrenzter Lebensdauer (also z.B. in with-Anweisungen).

Wie sieht das genau aus? So z.B.:
ausblenden Chrome-Quelltext
1:
2:
3:
4:
with foo := new Tfoo() do
begin
  foo.DoSomething();
end;
Wir müssen foo nirgendwo deklarieren und wir müssen auch nicht den Typ von foo angeben.

Ähnlich einfach kann man bei Bedarf neue Variablen einführen.
ausblenden Chrome-Quelltext
1:
2:
3:
begin
  var bar := new TBar();
end;

Diese Zeile steht, wie man sieht, irgendwo im Quelltext und nicht im Deklarationsteil.

Ähnlich praktisch ist auch die Deklaration von Zählern:
ausblenden Chrome-Quelltext
1:
for i : Integer := 0 to 5 do					

In der for-schleife muss man diese Syntax wählen, welche auch eine Variablendeklaration enthält. Sie ist mit den oben demonstrierten Syntaxschemas kompatibel. Type Inference ist das dann natürlich nicht mehr. ;-)

Ein guter Punkt, um zum nächsten Beispiel zu kommen, wo der Compiler Arbeit übernimmt. Oft kommt es vor, dass eine Property einfach nur ein privates Feld kapselt, also gar keine get- und set-Methoden vorhanden sind.

Hier hilft Chrome, den ewig gleichen Standardcode zu vermeiden, indem es folgende Syntax erlaubt:
ausblenden Chrome-Quelltext
1:
2:
3:
4:
5:
type
  TFoo = public class
  public
    property aProp : String;
  end;

Mehr ist nicht nötig, um eine Property anzulegen, der Rest wird implizit deklariert. (Obiges Beispiel zeigt ein weiteres Chrome-Feature: Typensichtbarkeit wird vollständig unterstützt.)

Kommen wir zu Kleinigkeiten, bei denen man erst einmal denkt, dass das nicht erwähnenswert ist. Aber zumindest mir geht es so, dass die Kleinigkeiten, denen man immer wieder begegnet, einen hohen Stellenwert erhalten. Da wäre zum einen die exit-Methode, der man einen Parameter übergeben kann. Anstatt also
ausblenden Chrome-Quelltext
1:
2:
3:
4:
5:
if aVal = anotherVal then
begin
  result := someVal;
  exit;
end;

schreiben zu müssen, reicht ein if aVal = anotherVal then exit(someVal);. Wie gesagt, eine Kleinigkeit, aber man gewöhnt sich dran ;-)

Nächste Kleinigkeit: "empty". Schonmal eine Methode gehabt, die im interface stehen musste, aber nur ein Dummy war? Kein Problem. Einfach folgendermaßen deklarieren:
ausblenden Chrome-Quelltext
1:
2:
3:
4:
5:
type
  TFoo = public class
  public
    method aMethod; empty;
  end;

Im implementation-Teil muss kein Dummy mehr angelegt werden. Kleinigkeiten, an die man sich gewöhnt ...



Auffällige Sprachunterschiede zu Delphi
Ich könnte meine Highlights noch fortsetzen und je länger ich mit Chrome arbeite, werde ich Neue entdecken. Aber das würde wohl mit der Zeit langweilig werden. Daher will ich noch ein paar auffällige Sprachunterschiede vorstellen, die ich nicht so liebgewonnen habe, die aber trotzdem von Bedeutung sind.

Allen voran wäre da die Unterstützung von Generics. Sie sind eine der Voraussetzungen, die eine Sprache für .NET 2.0 erfüllen muss, und sie haben daher auch Einzug in Chrome gefunden. Die Syntax ist praktisch dieselbe wie in C#:
ausblenden Chrome-Quelltext
1:
var li : List<Integer> := new List<Integer>();					

oder auch (Zitat aus der Chrome-Doku)
ausblenden Chrome-Quelltext
1:
2:
3:
type
  MyArrayList<T> = public class(ArrayList, IPersistentCollection)
    where T is PersistentObject, T has constructor;

Also auch die Unterstützung für Constraints ist da.

Weil ich an dieser Stelle nicht weiter auf Generics eingehen möchte (das ginge zu weit), möchte ich Euer Augenmerk auf das erste Code-Beispiel zu Generics lenken und zwar auf die Konstruktor-Syntax. Da .NET keine Konstruktoren mit Namen kennt, wurde auch in Chrome darauf verzichtet. Anstatt einen Defaultnamen wie z.B. "Create" und die Funktionensyntax zu verwenden, wurde auf die von C# bekannte new-Syntax zurückgegriffen. Es ist Geschmackssache, was man besser findet, logisch erscheinen mir beide. Ich muss aber zugeben, dass es am Anfang komisch aussieht, in Pascal mit "new" zu arbeiten ;-)

Ein weiterer Sprachunterschied zu Delphi sind die so genannten "Class Contracts". Class Contracts dienen der Überprüfung von Bedingungen, die vor / nach der Ausführung einer Methode wahr sein müssen (require / ensure) bzw. innerhalb einer Klasse immer erfüllt sein müssen (Invariants).
An dieser Stelle sei erneut ein Beispiel aus der Chrome-Doku zitiert:
ausblenden Chrome-Quelltext
1:
2:
3:
4:
5:
6:
method MyObject.DivideBy(aValue: Integer);
require
  aValue <> 0;
begin
  MyValue := MyValue/aValue;
end;
Es spricht eigentlich für sich, was hier passiert. Es wird sichergestellt, dass aValue nicht Null ist, weil durch Null zu teilen im Allgemeinen keine gute Idee ist. Invariants möchte ich an folgendem Beispiel demonstrieren:
ausblenden Chrome-Quelltext
1:
2:
3:
4:
5:
6:
7:
type
  TComplex = public class
  public
    property length : Double;
  public invariants
    length >= 0;
  end;

Hier wird festgelegt, dass die Eigenschaft "length" niemals kleiner Null sein darf. Wird sie es doch, wird eine Ausnahme geworfen. (Übrigens wäre diese Klasse so fertig, im implementation-Teil muss nichts mehr gemacht werden.)

Dass auf jeden Topf ein Deckel passt, ist bekannt. In Delphi muss man die Deckel allerdings selber aussortieren, was in Chrome für einen erledigt wird. Ein Beispiel (wieder aus der Doku) macht es deutlich:

ausblenden Chrome-Quelltext
1:
2:
3:
4:
5:
6:
   
   x := new ArrayList();
   x.add('Test');
   x.add(123);
  for each matching S: String in x do
     console.writeline(s);

Anstatt, dass die foreach-Schleife stupide alle Elemente durchläuft und man selber dafür verantwortlich ist zu schauen, ob es sich um den richtigen Typen handelt, werden hier nur bei den Elementen in den Schleifenrumpf gesprungen, welche der matching-Bedingung entsprechen.

Den letzten hier genannten Sprachunterschied möchte einfach mal unkommentiert stehen lassen ;-)
ausblenden Chrome-Quelltext
1:
2:
3:
4:
5:
6:
7:
  case forum of
    'df': DoDelphiForum;
    'csf': DoCSharpForum;
    'dl': DoDelphiLibrary;
    'csl': DoCSharpLibrary;
    else DoEntwicklerEcke;
  end;



Nobody is perfect
Doch auch Chrome hat Schwächen. Die liegen ganz klar nicht in der Sprache, sondern im Editor. Da ich momentan mit einem RC arbeite, will ich auf Fehler hier nicht eingehen, die können in der Final schon behoben sein. Es geht mir viel mehr darum, dass viele Refactoring-Funktionen entweder vollständig fehlen oder ungenügend umgesetzt wurden.

Smart Editing nennt sich das, was Chrome an Refactoring liefert. Doch was ist das? Zuerst einmal wären da die Navigation zwischen implementation- und interface-Abschnitt, wie man sie aus Delphi kennt. Ebenso die Klassenvervollständigung. Code Folding ist ebenfalls nichts Neues und das man Parameterlisten in einem Hint erhält, wenn man eine Funktion aufrufen will, ist inzwischen einfach Standard.

Die Code-Vervollständigung hat in Chrome einige wünschenswerte und praktische Ergänzungen erfahren. So wird das Erstellen von Properties dadurch unterstützt, dass man automatisch die entsprechenden get- und set-Methoden oder private Felder anlegen kann. Auch bietet die Vervollständigung beim Anlegen von Klassenoperatoren eine Liste der verfügbaren Operatoren. Eine Kleinigkeit, an die man sich wieder schnell gewöhnt: Tippt man "begin" und die Eingabetaste, wird das "end;" ergänzt und der Cursor an die richtige Stelle gesetzt.

Ein guter Ansatz, aber absolut nicht zu Ende gedacht, ist das Sync Rename. Damit sollte es eigentlich möglich sein, Mehtoden oder Klassen einfach umzubenennen. Leider heisst "Sync" hierbei nur, dass Änderung an diesen beiden Dingen (also Methode- und Klassennamen, anderes wird nicht unterstütz) synchron in interface- und implementation-Abschnitt gemacht wird. Aber im implementation-Abschnitt auch nur im Kopf der Methoden, nicht im Code. Und da muss ich einfach mal Fragen: Was soll das? Ich habe die Methode zigmal im Quelltext stehen und der ersetzt mir automatisch das Vorkommen, was ich am einfachsten selber finden kann? Na, vielen Dank auch.

Dann wäre da noch die automatische Deklaration von Variablen. Setzt man den Cursor auf einen Bezeichner und drückt eine Tastenkombination, erstellt Chorme eine entsprechende Property (Bezeicher fängt mir großen Buchstaben an), ein privates Feld (Bezeichner fängt mit "f" an) und ansonsten eine lokale Variable. Eine andere Tastenkombination erstellt eine neue Methode

Mehr an Refactoring gibt es nicht und das muss man einfach mal als mager bezeichnen. Da ist man deutlich mehr gewohnt und eine Firma, die ganz klar eine Konkurrenz zu Delphi präsentieren will, sollte auch auf diesem Bereich etwas mehr zu bieten haben. Und da muss man klar sagen: Delphi 2005 (2006 hab ich nicht) bietet deutlich mehr Komfort in diesem Bereich.


Mein Fazit
Ich habe den Kauf von Chrome nicht bereut und arbeite sehr gerne damit. Die Sprache bietet so viele Features, dass das Arbeiten trotz des dürftigen Editors Spaß macht. Ich entdecke immer wieder neue Features, die mir ein "Cool!" entlocken. Kurz um: Bei Chrome hat man einfach mal den Staub von der Sprache Pascal gewischt und das ist auch gut so. Das fehlende Refactoring ist ein deutlicher Mangel, aber es hat mich bisher nicht soweit gestört, dass es in mir Zweifel am Kauf von Chrome geweckt hätte.

Dieser Artikel kann auch auf meiner Homepage abgerufen werden: www.christian-stelzm...e/artikel/chrome.htm
Crossposting Delphi-PRAXiS: www.delphipraxis.net...ic83705,0,asc,0.html


Moderiert von user profile iconChristian S.: Topic aus Programmierwerkzeuge verschoben am Mo 07.01.2008 um 22:09

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: So 21.05.06 19:53 
Das klingt alles sehr interessant. Aber eine wichtige Frage hast du außen vor gelassen: Was macht man mit vorhandenen Projekten in Delphi?
Chrome habe ich selbst noch nie angesehen. Vieles sieht für mich so aus, als ob es sich an C# anlehnt, was ich jetzt weder positiv noch negativ bewerten möchte.
Die meisten im Forum werden wohl mit Delphi programmieren. Lohnt es sich vorhandene Projekte, sofern es überhaupt geht, auf Chrome umzustellen? Was mache ich mit dem gesamten VCL-Bereich? Gibt es Umwandlungsmöglichkeiten?

Ich glaube nicht, dass das so einfach geht. Aber da du damit schon experimentierst, kannst du doch ein paar Dinge dazu loswerden, oder?
Christian S. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 21.05.06 20:10 
Hallo!

Die Sprache von Chrome kann meines Wissens alles, was auch die Sprache Delphi kann. Du kannst auch weiterhin "procedure" und "function" schreiben. Chrome ist eine reine .NET-Sprache, damit erledigt sich die Frage nach der VCL praktisch von selbst. Ob die VCL .NET damit läuft, weiß ich nicht, aber Du hast sicherlich keinen Designersupport dafür, womit das eigentlich eh wegfällt. Für Portierung von VCL-Projekten sehe ich da eigentlich schwarz.

Die Portierung von Projekten, die nicht auf die VCL zurückgreifen (also Klassenbibliotheken), kann ich mir gut vorstellen. Es wird sicherlich nicht automatisch gehen, sondern alleine schon um die Vorteile der Plattform und der Sprache zu nutzen, Handardbeit erfordern.

Es wäre ansich mal 'ne Idee, die Version von SharpPix, die in Delphi .NET geschrieben habe, in Chrome zu portieren. Nicht, um dann wirklich damit zu arbeiten, sondern nur, um zu sehen, wie gut oder schlecht das geht. Mal sehen, vielleicht wenn ich aus dem Kino wieder da bin ;-)

user profile iconjasocul hat folgendes geschrieben:
Vieles sieht für mich so aus, als ob es sich an C# anlehnt, was ich jetzt weder positiv noch negativ bewerten möchte.
Es übernimmt Features daraus, das ist richtig. Gleichzeitig hat es auch Funktionen, welche C# nicht zu bieten hat. (Gerade arbeite ich z.B mit Sets ;-))

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Coder
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: So 21.05.06 20:59 
Klasse wollte schon lange wissen was es mit Chrome auf sich hat. :zustimm:
Firefox ist ja in Chrome geschrieben wenn ich mich nicht irre.
Das Case hat mich umgehauen. :mrgreen:
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 21.05.06 21:09 
Zitat:
Firefox ist ja in Chrome geschrieben wenn ich mich nicht irre.
Da irrst du dich. das chrome:// in FF hat nichts mit Chrome zu tun. FF ist in c++ geschrieben.

_________________
Markus Kinzler.
Stoney
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 122

Mac OS X 10.6 "Snow Leopard", Ubuntu Linux 9.04, Mandriva 2010, Win 7, Win Vista, Win XP
Object Pascal (Turbo Delphi, FPC 2.2.4, Lazarus), C++ (Code::Blocks, XCode), Java (Eclipse)
BeitragVerfasst: So 21.05.06 21:19 
Sehr interssanter und aufschlussreicher Artikel.
Da habe ich richtig Lust bekommen, Chrome mal selber auszuprobieren. Zum Glück gibt es ja eine freie Version von Chrome, die man mit Mono benutzen kann und die bereits auf meiner Platte installiert ist. Bis jetzt habe ich nur leider keine Zeit gefunden mich genauer damit zu beschäftigen.
Robert_G
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416


Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
BeitragVerfasst: So 21.05.06 22:01 
user profile iconChristian S. hat folgendes geschrieben:
Chrome ist eine reine .NET-Sprache, damit erledigt sich die Frage nach der VCL praktisch von selbst. Ob die VCL .NET damit läuft, weiß ich nicht, aber Du hast sicherlich keinen Designersupport dafür, womit das eigentlich eh wegfällt. Für Portierung von VCL-Projekten sehe ich da eigentlich schwarz.
Generell kann man absolut vergessen alles was dem Delphi designer entsprungen ist in eine reine .Net-Umgebung zu portieren.
Aber Code, der die VCL nutzt muss nicht gleich weggeworfen werden. Es gibt ein OSS Projekt namens ShineOn, welches die VCL auf [meta]also nicht daneben wie Borlands Portierung[/meta] .Net abbildet.
Wer seinen Code sauber und OO vom View getrennt hat sollte damit sehr schnell zumindest die Logik portieren können. Wenn man auch noch auf die ShineOn.Win32 verzichten kann, hat man auch gleich eine unter Mono getstete API.

Zitat:
Es wäre ansich mal 'ne Idee, die Version von SharpPix, die in Delphi .NET geschrieben habe, in Chrome zu portieren. Nicht, um dann wirklich damit zu arbeiten, sondern nur, um zu sehen, wie gut oder schlecht das geht. Mal sehen, vielleicht wenn ich aus dem Kino wieder da bin ;-)

In den Projektoptionen findest du unter Compatibility compiler switches, mit denen du etwas kompatibler zu Delphi/FPC wirst.
Zum Beispiel kannst du Delphis syntax für Konstruktoren aktivieren, sogar das kranke "with" ohne Alias kannst du (vorübergehend) erlauben.

Was dich beim Portieren von D.Net sicherlich gehörig anpissen wird ist D.Nets komische Set-Syntax für Events: Chrome benutzt hier += und -=.
include(Instanz.Event, EventHandlerProc); wird zu Instanz.Event += EventHandlerProc;
Das lässt sich aber easy über eine RegEchse direkt im Studio regeln.
Zitat:
Es übernimmt Features daraus, das ist richtig. Gleichzeitig hat es auch Funktionen, welche C# nicht zu bieten hat. (Gerade arbeite ich z.B mit Sets ;-))
Und Eiffel nicht vergessen!
Wenn man sich an Design By Contract gewöhnt fragt man sich, wie das vorher überhaupt ging. :mrgreen:

Edit: Es ist sogar möglich globale Objekte wie lose Funktionen und globale Variablen zu erlauben. Aber das ist auf Dauer sehr frickelig (mit Sicherheit so beabsichtigt ;) )
Christian S. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 24.05.06 01:27 
Hallo!

Ich habe mal eine Klassenbibliothek, welche Teil von SharpPix ist, nach Chrome portiert. Im folgenden ein Bericht, den ich quasi-live geschrieben habe ;-)


Zuerst hatte ich alle Dateien der Klassenbibliothek auf einmal dem Projekt hinzugefügt. Das resultierte in einer frustrierenden Anzahl an Fehlern, sodass ich mich entschied, die Dateien doch nach und nach zu portieren.

Die erste Datei (u_common.pas) enthält (zu meiner Schande) globale Methoden. Mit einem Schalter in den Projektoptionen schluckt Chrome auch das. Auf dem Wege aktiviere ich direkt mal die "Create"-Konstruktor-Syntax und die "with"-Syntax. Bin mir nicht sicher, ob ich letzteres brauche, aber mal schauen, ich will ja nur spielen ;-)

Damit kompiliert die erste Datei schonmal problemlos. Auf zur nächsten Datei (u_methods.pas). Dort stellt sich als größtes Problem die Funktion "Round" heraus. Sie mit "Math.Round" zu ersetzen reicht nicht, denn das liefert einen Double zurück, "Round" einen Integer.

Ich entscheide mich, eine eigene Funktion mit Namen Round zu schreiben. Da u_common.pas eh schon globale Funktionen enthält, schreibe ich die einfach mal dazu ;-) Beim Einfügen von u_common.pas in die Uses-Klausel von u_methods.pas bemerke ich, dass Chrome zu dieser merkwürdigen Mischart von Delphi, Dateien bzw. Namespaces einzubinden, kompatibel ist.

Weiter geht's. Schnell noch bei Werten von Enums den Namen des Enums davor schreiben ("side_width" wird zu "TSide.side_width"), dann kompiliert auch diese Datei.

Die nächste Datei (u_settingsSaver.pas) birgt das Mini-Problem, dass Default-Parameter in Chrome mit einem ":=" statt einem "=" belegt werden. Das ist natürlich schnell behoben ;-) Das Fehlen einer SetLength-Methode leider weniger. Ich schreibe mir also einen generischen Ersatz, der das Verhalten der SetLength-Methode nachbildet, die vorhandenen Elemente beim Verlängern oder Verkürzen eines Arrays beizubehalten. Ein paar spezialisierte Überladungen der generischen Methode machen das Leben noch leichter.

Bei Properties, welche in einem interface definiert werden, mag er es anscheinend nicht, wenn man nicht nur read/write angibt, sondern auch direkt die entsprechenden Getter und Setter mit Namen. Stattdessen will Chrome im Interface nur wissen, ob die Property read-only, write-only oder "normal" ist. Auch das ist schnell geändert.

Ich öffne die nächste Datei (u_resizer.pas). Als erstes mosert er über der Delphi-Syntax, verschaltete Typen zu deklarieren. Also die Record-Deklaration aus der Klasse rausbefördert und ein "nested in ..." drangetackert. Als nächstes stolpert er über "strict private", denn Chrome ist da, wo private wirklich private ist :zwinker: Ich mache das "strict" weg und hoffe, dass ich nicht irgendwo wirklich mal Delphis Art der Sichtbarkeiten benutzt habe.

Nach Behebung dieses Problems muss ich erst einmal nachschlagen, was das Wort "static" in Delphi nach einer Klassenmethode zu suchen hat. Ah ja, kein self-Paramter. Mit anderen Worten: Markieren, Backspace. Das nächste Problem, nämlich das "method" ein Keyword ist, löse ich mit dem Einfügen eines "&"-Zeichens. Anschließend wird aus jedem "TObject" ein "object" gemacht. Außerdem heissen Operatoren ein wenig anders, aber auch das ist nur Suchen und Ersetzen.

Damit wäre ich fast fertig mit dem Portieren dieser Biblitohek, aber diese Funktion bereitet mir Probleme:
ausblenden Chrome-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
class function TnamePart.isChecked(checkedItems: CheckedListBox.CheckedItemCollection): Boolean;
var
  o : object;
begin
  result := false;

  for o in checkedItems do
    if o.ClassType = self  then
    begin
      result := true;
      exit;
    end;
end;

Des Pudels Kern ist, dass in Delphi auch Klassenmethodenen einen self-Parameter haben (siehe oben, "static" verhindert nämlich genau das) und es das sonst in .NET nicht gibt. Hier ist also mehr Nachdenken gefragt, als ich zu dieser Uhrzeit für ein "Mal schauen, ob's geht"-Projekt aufbringen will. ;-)

Bis auf diese letzte Methode bin ich eigentlich ziemlich zufrieden. Der Portierungsaufwand sinkt mit jedem Hindernis, welches man bewältigt, sofern man die Lösungen wiederverwendbar macht. Handarbeit ist aber durchaus noch gefragt und nur weil es kompilieren würde, heisst das auch noch nicht, dass es alles so tut wie unter Delphi.

Grüße
Christian

//edit: Ich wusste doch, dass ich das letzte Problem kenne: www.c-sharp-forum.de...ausfinden_52104.html :zwinker:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Robert_G
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416


Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
BeitragVerfasst: Mi 24.05.06 01:58 
Du kannst dieses Verhalten [meta]implizite class ref als erster parameter[/meta] in Chrome bekommen, wenn du die class method als virtual deklariert. ;)
Die große Frage ist nur wie sinnvoll das sein soll...
(.)Netter wäre das:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
class function TNamePart.T>(checkedItems : CheckedListBox.CheckedItemCollection) : Boolean;
begin
  for matching item : T in checkedItems do
    exit(true);
  
  exit(false);  
end;


Edit:
Zitat:
//edit: Ich wusste doch, dass ich das letzte Problem kenne:

Interessant, wie man Dinge nach einiger Zeit aus anderem Blickwinkel sieht...
Ich habe vor nicht all zu langer Zeit sämtliche MetaClasses aus meinem Code geworfen. Passt einfach nicht zu .Net, IMO ;)