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 Komponente entwickelt aber nicht sichtbar..?! (https://www.delphipraxis.net/91983-komponente-entwickelt-aber-nicht-sichtbar.html)

Dragon27 12. Mai 2007 19:41


Komponente entwickelt aber nicht sichtbar..?!
 
Hallo,

also habe jetzt mal Version 0.1 Beta meine Kompo soweit fertig... doch jetzt der Schock... Wenn ich sie auf Form ziehen will wird sie nicht angezeigt... außerdem heißt es nach dem 2. Versuch, dass der Arbeitsspeicher voll ist....???

Delphi-Quellcode:
unit Stringverwaltung;

interface

uses
  SysUtils, Classes, Dialogs;

type
  TStringVarverwaltung = class(TComponent)
  private
    { Private-Deklarationen }
    cFehler:Boolean;
    type TVariable = record
    Name:String;
    Programm:String;
    Inhalt:String;
    Free:Boolean;
    end;
    var Variablen: array [1..9999999] of TVariable;
    function GetFree():integer;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create (AOwner : TComponent) ; override ;
  published
    { Published-Deklarationen }
    property Fehlermeldungen : Boolean read CFehler write CFehler;
    public Procedure NewVar(Name,Programm,Inhalt:String);
    public Procedure DelVar(Name,Programm:String);
    public Procedure DelVarbyProg(Programm:String);
    public Function GetInhalt(Name,Programm:String):String;
  end;



procedure Register;


implementation


procedure Register;
begin
  RegisterComponents('BlueRain', [TStringVarverwaltung]);
end;

constructor TStringVarverwaltung.Create(AOwner : TComponent);
var i:integer;
begin
for i := 1 to 9999999 do begin
Variablen[i].Free:=True;
end;

end;

Function TStringVarverwaltung.GetInhalt(Name,Programm:String):String;
var i:integer;
begin
for i := 1 to 9999999 do begin
  if (Variablen[i].Name=Name) and (Variablen[i].Programm=Programm) then begin
  Result:=Variablen[i].Inhalt;
  end;
end;

end;


function TStringVarverwaltung.GetFree():integer;
var i, ergebnis:integer;
begin
Ergebnis:=-1;
for I := 1 to 9999999 do begin
  if Variablen[i].Free=true then begin
  ergebnis:=i;
  break;
  end;

end;
if ergebnis=-1 then begin
 if cFehler=true then Messagedlg('Speicherüberlauf bei 9999999+1 -TStringVarVerwaltung-',mterror,[mbok],0);
end;
 Result:=Ergebnis;
end;


Procedure TStringVarVerwaltung.DelVarbyProg(Programm:String);
var i:integer;
begin
for i := 1 to 9999999 do begin
  if Variablen[i].Programm=Programm then begin
  Variablen[i].Name:='';
  Variablen[i].Programm:='';
  Variablen[i].Inhalt:='';
  Variablen[i].Free:=true;
  end;
end;

end;


Procedure TStringVarVerwaltung.DelVar(Name,Programm:String);
var i:integer;
begin
for i := 1 to 9999999 do begin
  if (Variablen[i].Name=Name) and (Variablen[i].Programm=Programm) then begin
  Variablen[i].Name:='';
  Variablen[i].Programm:='';
  Variablen[i].Inhalt:='';
  Variablen[i].Free:=true;
  end;
end;

end;



Procedure TStringVarverwaltung.NewVar(Name,Programm,Inhalt:String);
var index:integer;
begin
index:=Getfree();
Variablen[index].Name:=Name;
Variablen[index].Programm:=Programm;
Variablen[index].Inhalt:=Inhalt;
Variablen[index].Free:=False;

end;


end.
Bitte schaut es Euch mal durch .... ich weiß dass das Ding nicht perfekt ist aber ich will jetzt mal für den Anfang nur dass es funct...

Danke!

brechi 12. Mai 2007 19:44

Re: Komponente entwickelt aber nicht sichtbar..?!
 
var Variablen: array [1..9999999] of TVariable;

Und du weißt nicht warum der Arbeitsspeicher voll wird?

inherited 12. Mai 2007 19:45

Re: Komponente entwickelt aber nicht sichtbar..?!
 
Wieso nimmst du keine dynamischen Arrays?

Dragon27 12. Mai 2007 19:59

Re: Komponente entwickelt aber nicht sichtbar..?!
 
Hallo,

ja ich weiß, dass das nicht sauber ist.... aber es muss ja an was anderem Liegen.... das nimmt sicherlich keine 4 GB in Anspruch.. oder?

Trotzdem Danke!

Gruß

Andy

Hawkeye219 12. Mai 2007 20:03

Re: Komponente entwickelt aber nicht sichtbar..?!
 
Hallo Andy,

wenn man einen constructor überschreibt, sollte man auch den geerbten constructor aufrufen.

Gruß Hawkeye

Dragon27 12. Mai 2007 20:05

Re: Komponente entwickelt aber nicht sichtbar..?!
 
Hallo,

sorry du ist meine erste Kompo und kenne mich da nicht aus wie macht man da was?

Danke!

inherited 12. Mai 2007 20:06

Re: Komponente entwickelt aber nicht sichtbar..?!
 
MeinName Create;
Und rate mal was mein Name ist ;)
<- siehe da

mkinzler 12. Mai 2007 20:08

Re: Komponente entwickelt aber nicht sichtbar..?!
 
Zitat:

ja ich weiß, dass das nicht sauber ist....
Nicht sauber ist ne Untertreibung.
Zitat:

aber es muss ja an was anderem Liegen.... das nimmt sicherlich keine 4 GB in Anspruch.. oder?
Rechne doch mal aus wieviel Speicher belegt wird.
Übrigens kann ein Programm unter Windows nur 2 GB belegen

Dragon27 12. Mai 2007 21:13

Re: Komponente entwickelt aber nicht sichtbar..?!
 
Hallo,

also gut werde den Array noch dynamisch machen... Danke ;-)


Also das hier geht net:

Delphi-Quellcode:
constructor TStringVarverwaltung.Create(AOwner : TComponent);
var i:integer;
begin
inherited Create; //[DCC Fehler] Stringverwaltung.pas(51): E2035 Nicht genügend wirkliche Parameter
for i := 1 to 9999999 do begin
Variablen[i].Free:=True;
end;

end;
Danke für Eure Hilfe!

mkinzler 12. Mai 2007 21:18

Re: Komponente entwickelt aber nicht sichtbar..?!
 
Delphi-Quellcode:
inherited Create( AOwner);
Warum erzeugst du im Konstruktor schon wieder eine so rrsinnig große Menge an Elementen anstatt zur Laufzeit so viele wie nötig zu erzeugen? das ist doch der Vorteil der dynamsichen Variante.

Hansa 12. Mai 2007 21:19

Re: Komponente entwickelt aber nicht sichtbar..?!
 
Destructor fehlt auch. Die Strings sind im Record sogar doppelt drin. Frage am Rande : seit wann schreibt man im private TYPE rein ? :shock: Um einen Schritt weiter zu kommen würde ich mal zumindest Shortstring verwenden. Unsauber bleibts dann aber immer noch. Konzept ist eben grundsätzlich falsch angelegt. :mrgreen:

@roter Kasten : free wird aufgerufen und nicht zugewiesen.

siehe roter Kasten Nr.2. :mrgreen:

Hawkeye219 12. Mai 2007 21:45

Re: Komponente entwickelt aber nicht sichtbar..?!
 
Hallo Hansa,

Zitat:

Destructor fehlt auch.
Was würdest du im überschriebenen destructor machen?

Zitat:

Die Strings sind im Record sogar doppelt drin.
???

Zitat:

Frage am Rande : seit wann schreibt man im private TYPE rein ?
Man kann das tun - seit Delphi 2005.

Zitat:

Um einen Schritt weiter zu kommen würde ich mal zumindest Shortstring verwenden.
Würde das den anfänglichen Speicherplatzbedarf nicht noch weiter erhöhen?

Zitat:

free wird aufgerufen und nicht zugewiesen.
Hast du bemerkt, daß Free ein Feld des Records ist?

Gruß Hawkeye

arohde 12. Mai 2007 22:12

Re: Komponente entwickelt aber nicht sichtbar..?!
 
Hi,

1. Wozu brauchst du 10 Millionen-1 Strings

2. Wenn man so was macht, dann benutze wie oben angemerkt dynamische Arrays.Die solltest du aber nicht am Anfang in einer Schleife von 1 bis 9999999 initialisieren, sonst hast du doch wieder 10 Millionen-1 Elemente im Array.

3. Du könntest das Ganze auch mit einer doppelt verketteten Liste implementieren und die Objekte erst anlegen, wenn ein Neues gebraucht wird.

4. Fang doch mal klein an, wenn du mal ausprobieren willst, z.B. array[1..99] of TVariable zum Testen.

Ciao,
Alex

Hansa 13. Mai 2007 01:33

Re: Komponente entwickelt aber nicht sichtbar..?!
 
Da ist einiges zu tun :

Zitat:

Destructor fehlt auch. Was würdest du im überschriebenen destructor machen?
Was wohl ? Das ist keine Antwort. Wie wärs mit Free ?

Zitat:

Die Strings sind im Record sogar doppelt drin.
Das dürfte wohl klar sein und die Fehlermeldungen auch zum Teil erklären. :P Der Record enthält 2 strings.

Zitat:

Um einen Schritt weiter zu kommen würde ich mal zumindest Shortstring verwenden.
Würde das den anfänglichen Speicherplatzbedarf nicht noch weiter erhöhen?

Durch Reduzierung des Speicherplatzes den Speicherplatz erhöhen ? :shock:

Zitat:

free wird aufgerufen und nicht zugewiesen. Hast du bemerkt, daß Free ein Feld des Records ist?
Wer ein Feld als free benennt ist selber Schuld. :mrgreen:

Jelly 13. Mai 2007 08:57

Re: Komponente entwickelt aber nicht sichtbar..?!
 
Zitat:

Zitat von Dragon27
also habe jetzt mal Version 0.1 Beta meine Kompo soweit fertig... doch jetzt der Schock... Wenn ich sie auf Form ziehen will wird sie nicht angezeigt???

Mal abgesehen von den anderen Fehlern mit dem Speicher, den du hier schilderst, solltest du wissen dass Komponenten, die direkt von TCOmponent abgeleitet werden, unsichtbare Komponenten sind. Dann muss du schon einen anderen Vorgänger wählen.

Was soll die Komponente dann letzten Endes machen. Ist ja schrecklich, wie unbedacht Du mit Systemresourcen umgehst.

Wenn es nur darum geht, 10 Millionen Datensätze zu verwalten mit Such- und Löschfunktionen, so würde sich eher eine Datenbanktabelle für dein Vorhaben eignen.

SirThornberry 13. Mai 2007 09:26

Re: Komponente entwickelt aber nicht sichtbar..?!
 
Zitat:

Zitat von Hansa
Zitat:

Um einen Schritt weiter zu kommen würde ich mal zumindest Shortstring verwenden.
Würde das den anfänglichen Speicherplatzbedarf nicht noch weiter erhöhen?

Durch Reduzierung des Speicherplatzes den Speicherplatz erhöhen ? :shock:

Shortstrings sind doch Strings mit einer festen Länge von 255 Byte + 1 Byte wieviel Byte belegt sind (oder nicht?). Somit würde ich auch schließen das ein Shortstring mehr speicher braucht als ein leerer String (= 4 Byte)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 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