![]() |
wo kommt das type hin?
Hallo
Ich möchte einer Procedure ein Global definiertes Array übergeben. Ich habe gelesen, das ich dazu ein Type definieren muss. So etwa:
Delphi-Quellcode:
Doch leider weiss ich nicht, wo ich diese Zeile hinpacken soll.
type TArray: array[1..5] of Integer;
Es wird dauernd rot unterstrichen... Danke für die Hilfe |
AW: wo kommt das type hin?
Richtig würde es lauten:
Delphi-Quellcode:
Und es kommt dort hin, wo auch
TArray = array[1..5] of Integer;
Delphi-Quellcode:
zu finden ist. Wahlweise davor oder nach dem entsprechenden
TForm1 = class(TForm)
Delphi-Quellcode:
end;
[edit]Wenn der Inhalt global verfügbar sein soll, auch daran denken, ihn in der
Delphi-Quellcode:
-Sektion zu definieren.[/edit]
var
[edit2]Übrigens: Ein Typ zu definieren ist eigentlich gar nicht notwendig, wenn es nur um die Globalisierung geht.[/edit2] Ich liebe inline-codes. *pfeif* |
AW: wo kommt das type hin?
Naja, es kommt immer drauf an, wie die Sichtbarkeit aussehen soll. Du kannst es global machen, also zwischen dem interface und implementation-Keyword, oder auch nur innerhalb einer Klasse, oder auch innerhalb einer Methode definieren ;)
|
AW: wo kommt das type hin?
Und vorallem wenn es sich um globale Sachen (Typen/Konstanten/Variablen) handelt, dann sollte man diesen auch einen orgendlichen Namen verpassen.
TArray kennen neuer Delphi z.B. schon und dieses stimmt mit deiner Definition nicht überein. Und dann ist es immer gut, wenn man seine verwendete Delphiversion angibt, damit man auch passende Tipps geben kann. Ab Delphi 2006, bzw. TDE kann man auch alles schön zusammenhalten.
Delphi-Quellcode:
unit MeineGlobalenSachen;
interface type TMeineGlobaleSammlung = class public type TIntegerArray10 = array[1..10] of Integer; private FVariable: array of Integer; function MeinSetter(idx: Integer; i: Integer); function MeinGetter(idx: Integer): Integer; public GloableVariable: TIntegerArray10; property MeinArray[idx: Integer]: Integer read MeinGetter write MeinSetter; end; var MeineGlobaleSammlung: TMeineGlobaleSammlung; implementation initialization MeineGlobaleSammlung := TMeineGlobaleSammlung.Create; finalization MeineGlobaleSammlung.Free; end. |
AW: wo kommt das type hin?
Zitat:
|
AW: wo kommt das type hin?
Vielen Dank
es hat teilweise geklappt... Ich hab folgendes Definiert:
Delphi-Quellcode:
doch leider "verlieren" gewisse arrays auf unerklärliche weise Daten
MyData = array[1..100000] of integer;
public data1,data2,data3,data4,data5,data6,data7,data8: MyData; Woran könnte dies liegen? Wenn ich Sie nach dem befüllen noch kurz verwende gehen einige nicht gleich verloren Edit: Ich verwende Delphi2007 Enterprise |
AW: wo kommt das type hin?
Wir bräuchten allgemein wohl etwas mehr Code, sodass wir helfen können, denn der Kontext, in dem du das verwendest erschließt sich so keinem.
|
AW: wo kommt das type hin?
Gut...
Hier mein gesamter Code Funktion: Ich empfange von einer Computer Hardware Dezimal Zahlen von 0 - 255 Diese wandle ich nach Binär und stelle die 1en und 0en auf einer Oberfläche dar Das ganze ist dan ein LogicAnalyzer In den Arrays Daten1-Daten8 steht wo eine 1 oder eine 0 ist bezogen auf die gesamte anzahl an gesammelten daten Beispiel
Delphi-Quellcode:
Data[1] := 1 //Eine Eins
Data[2] := 4112 //Steht an stelle 4112 des gesamten
Delphi-Quellcode:
unit main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, StdCtrls, jpeg, ImgList, ComCtrls; type MyData = array[1..100000] of integer; TForm1 = class(TForm) MainMenu1: TMainMenu; OpenLogic1: TMenuItem; About1: TMenuItem; Image1: TImage; Image2: TImage; Image3: TImage; Image4: TImage; Image5: TImage; Image6: TImage; Image7: TImage; Image8: TImage; Edit1: TEdit; Label2: TLabel; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; Edit8: TEdit; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Image9: TImage; Shape1: TShape; ScrollBar1: TScrollBar; ImageList1: TImageList; Label9: TLabel; Label10: TLabel; Image12: TImage; Image13: TImage; Image14: TImage; Image15: TImage; Image16: TImage; Image17: TImage; Image18: TImage; ProgressBar1: TProgressBar; ScrollBar2: TScrollBar; Label11: TLabel; About2: TMenuItem; KeineAktualisierungverfgbar1: TMenuItem; Label1: TLabel; Label12: TLabel; update_check: TTimer; marker1: TPanel; dispmarker1: TLabel; Button1: TButton; marker2: TPanel; dispmarker2: TLabel; GroupBox1: TGroupBox; dispdmarker: TLabel; dispfreq: TLabel; ComboBox1: TComboBox; Button2: TButton; Label13: TLabel; ListBox1: TListBox; Button3: TButton; Label14: TLabel; Memo1: TMemo; Button5: TButton; ComboBox2: TComboBox; procedure draw_raw_data(drawspace:TImage;color:TColor; data_in:MyData); procedure prepaire_data; procedure refresh_all; procedure FormCreate(Sender: TObject); procedure About2Click(Sender: TObject); procedure KeineAktualisierungverfgbar1Click(Sender: TObject); procedure update_checkTimer(Sender: TObject); procedure refresh_marker(X:integer;marker:TPanel;display:TLabel); procedure refresh_times; procedure marker1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Button1Click(Sender: TObject); procedure marker2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormShow(Sender: TObject); procedure ComboBox1DropDown(Sender: TObject); procedure Button2Click(Sender: TObject); procedure ComboBox1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure ScrollBar2Change(Sender: TObject); procedure clear_disp(disp:TImage); procedure clear_all; procedure ScrollBar1Change(Sender: TObject); private { Private-Deklarationen } public version_t:string; version,timems,timebasems,timeleft,timeright,marker1ms,marker2ms:integer; data1,data2,data3,data4,data5,data6,data7,data8: MyData; end; var Form1: TForm1; implementation uses about, update,D2XXUnit, CfgUnit; var DevicePresent : Boolean; Selected_Device_Serial_Number : String; Selected_Device_Description : String; Store_Buffer : Array[0..512000] of byte; //512kb Speicher. Store_Buffer_Count:integer; gesamt_einheit:integer; ein_pixel,buffer_size,start,stop:integer; main_color:tcolor; {$R *.dfm} procedure TForm1.refresh_times; begin timeleft := ((timems div ScrollBar1.Max) * ScrollBar1.Position) - timebasems; timeright := ((timems div ScrollBar1.Max) * ScrollBar1.Position); Label9.Caption := inttostr(timeleft)+'ms'; Label10.Caption := inttostr(timeright)+'ms'; end; procedure TForm1.ScrollBar1Change(Sender: TObject); begin start := ScrollBar1.Position; Label9.Caption := inttostr(start); stop := ScrollBar1.Position + (gesamt_einheit div ScrollBar2.Position); Label10.Caption := inttostr(stop); clear_all; refresh_all; end; procedure TForm1.ScrollBar2Change(Sender: TObject); begin ScrollBar1.Max := (gesamt_einheit); Label11.Caption := inttostr(gesamt_einheit div ScrollBar2.Position); ein_pixel := (gesamt_einheit div ScrollBar2.Position) div Image9.Width; clear_all; refresh_all; end; procedure TForm1.refresh_marker(X:integer;marker:TPanel;display:TLabel); var mslen:integer; begin if ((marker.Left + X) > (Image9.Left - 1)) and ((marker.Left + X) < ((Image9.Left + Image9.Width) +1)) then begin mslen := (timebasems * timems div (Image9.width)); display.Caption := inttostr( ( ((marker.Left - Image9.Left) * mslen) div 10000) + timeleft + 1)+'ms'; marker.Left := marker.Left + X; display.Left := display.Left + X; if marker.Name = 'marker1' then marker1ms := ( ((marker.Left - Image9.Left) * mslen) div 10000) + timeleft + 1; if marker.Name = 'marker2' then marker2ms := ( ((marker.Left - Image9.Left) * mslen) div 10000) + timeleft + 1; dispdmarker.Caption := 'Delta ms: '+inttostr(marker2ms-marker1ms)+'ms'; dispfreq.Caption := 'Freq. Hz: '+ inttostr(1000 div ((marker2ms-marker1ms)))+'Hz'; end; end; procedure draw_up(pointer:TImage;color:TColor;x:integer); begin with pointer.Canvas do begin Pen.Color := color; Pen.Width := 1; MoveTo(x,25); LineTo(x,5); //color := clBlack; end; //showmessage(inttostr(x)); end; procedure draw_down(pointer:TImage;color:TColor;x:integer); begin with pointer.Canvas do begin Pen.Color := color; Pen.Mode := pmMerge; Pen.Width := 1; MoveTo(x,5); LineTo(x,25); end; end; procedure draw_line(pointer:TImage;color:TColor;x1,x2,y:integer); begin with pointer.Canvas do begin Pen.Color := color; Pen.Width := 1; MoveTo(x1,y); LineTo(x2,y); end; end; procedure TForm1.About2Click(Sender: TObject); begin Form2.ShowModal; end; procedure TForm1.Button1Click(Sender: TObject); begin if dispmarker1.Visible = true then begin dispmarker1.Visible := false; dispmarker2.Visible := false; marker1.Visible := false; marker2.Visible := false; end else begin dispmarker1.Visible := true; dispmarker2.Visible := true; marker1.Visible := true; marker2.Visible := true; end; end; procedure TForm1.Button2Click(Sender: TObject); begin If Open_USB_Device_By_Serial_Number(Selected_Device_Serial_Number) = FT_OK then begin FT_Current_Parity := 1; FT_Current_StopBits := 0; FT_Current_DataBits := 8; Set_USB_Device_DataCharacteristics; FT_Current_Baud := 3000000; Set_USB_Device_BaudRate; Label13.Caption := 'Status: Verbunden mit: ' + Selected_Device_Serial_Number; end else begin Label13.Caption := 'Status: Fehler beim verbinden mit: ' + Selected_Device_Serial_Number; end; end; procedure TForm1.Button3Click(Sender: TObject); begin ProgressBar1.Max := gesamt_einheit; ProgressBar1.Position := 0; repeat Read_USB_Device_Buffer(buffer_size); Move(FT_In_Buffer[0], Store_Buffer[Store_Buffer_Count], Length(FT_In_Buffer)); Inc(Store_Buffer_Count, buffer_size); ProgressBar1.Position := ProgressBar1.Position + buffer_size; Label14.Caption := 'Saved: '+inttostr(ProgressBar1.Position); Application.ProcessMessages; until ProgressBar1.Position = gesamt_einheit; end; procedure TForm1.refresh_all; begin draw_raw_data(Image9,main_color,data1); draw_raw_data(Image12,main_color,data2); draw_raw_data(Image13,main_color,data3); draw_raw_data(Image14,main_color,data4); draw_raw_data(Image15,main_color,data5); draw_raw_data(Image16,main_color,data6); draw_raw_data(Image17,main_color,data7); draw_raw_data(Image18,main_color,data8); end; procedure TForm1.Button5Click(Sender: TObject); begin clear_all; prepaire_data; refresh_all; end; {procedure doFoo2(const a: Array of Byte); var i:integer; value_old:integer; data_counter:integer; begin i := 0; data_counter := 1; value_old := 500; repeat if a[i] <> value_old then begin Form1.Memo1.Lines.Add(inttostr(a[i])+','+inttostr(i)+','); if(a[i] = 1) then begin Form1.data[data_counter] := 1; Form1.data[data_counter + 1] := i; data_counter := data_counter + 2; end; if(a[i] = 0) then begin Form1.data[data_counter] := 0; Form1.data[data_counter + 1] := i; data_counter := data_counter + 2; end; value_old := a[i]; end; i := i + 1; until gesamt_einheit <= i; Form1.data[data_counter] := 748575; end; } procedure TForm1.ComboBox1Click(Sender: TObject); begin Selected_Device_Serial_Number := ListBox1.Items.Strings[ComboBox1.ItemIndex]; //Showmessage(Selected_Device_Serial_Number); end; procedure TForm1.ComboBox1DropDown(Sender: TObject); var S:String; DeviceIndex : DWord; I : Integer; LV : TListItem; begin ComboBox1.Items.clear; //Auswahl löschen ListBox1.Clear; //Geräte ID's löschen GetFTDeviceCount; S := IntToStr(FT_Device_Count); DeviceIndex := 0; If FT_Device_Count > 0 then Button2.Enabled := true; For I := 1 to FT_Device_Count do Begin GetFTDeviceDescription ( DeviceIndex ); ComboBox1.Items.Add(FT_Device_String); GetFTDeviceSerialNo( DeviceIndex ); ListBox1.Items.Add(FT_Device_String); DeviceIndex := DeviceIndex + 1; End; end; procedure TForm1.prepaire_data; var alter_wert,counter,i,i2,temp_wert,cd1,cd2,cd3,cd4,cd5,cd6,cd7,cd8:integer; vorheriges_x,aktuelle_flanke:integer; linie_zeichnen:boolean; temp_data,old_data:Array[0..8] of integer; begin i := 0; i2:= 0; counter := 1; vorheriges_x := 0; aktuelle_flanke := 0; cd8 := 1; cd7 := 1; cd6 := 1; cd5 := 1; cd4 := 1; cd3 := 1; cd2 := 1; cd1 := 1; repeat //Form1.Memo1.Lines.Add(inttostr(Store_Buffer[i])+',Bin:'); temp_data[0] := Store_Buffer[i] mod 2; temp_wert := Store_Buffer[i] div 2; temp_data[1] := temp_wert mod 2; temp_wert := temp_wert div 2; temp_data[2] := temp_wert mod 2; temp_wert := temp_wert div 2; temp_data[3] := temp_wert mod 2; temp_wert := temp_wert div 2; temp_data[4] := temp_wert mod 2; temp_wert := temp_wert div 2; temp_data[5] := temp_wert mod 2; temp_wert := temp_wert div 2; temp_data[6] := temp_wert mod 2; temp_wert := temp_wert div 2; temp_data[7] := temp_wert mod 2; if temp_data[0] <> old_data[0] then begin data1[cd1] := temp_data[0]; data1[cd1+1] := i; cd1 := cd1 + 2; end; if temp_data[1] <> old_data[1] then begin data2[cd2] := temp_data[1]; data2[cd2+1] := i; cd2 := cd2 + 2; end; if temp_data[2] <> old_data[2] then begin data3[cd3] := temp_data[2]; data3[cd3+1] := i; cd3 := cd3 + 2; end; if temp_data[3] <> old_data[3] then begin data4[cd4] := temp_data[3]; data4[cd4+1] := i; cd4 := cd4 + 2; end; if temp_data[4] <> old_data[4] then begin data5[cd5] := temp_data[4]; data5[cd5+1] := i; cd5 := cd5 + 2; end; if temp_data[5] <> old_data[5] then begin data6[cd6] := temp_data[5]; data6[cd6+1] := i; cd6 := cd6 + 2; end; if temp_data[6] <> old_data[6] then begin data7[cd7] := temp_data[6]; data7[cd7+1] := i; cd7 := cd7 + 2; end; if temp_data[7] <> old_data[7] then begin data8[cd8] := temp_data[7]; data8[cd8+1] := i; cd8 := cd8 + 2; end; Move(temp_data[0], old_data[0], Length(temp_data)); //Array kopieren i := i + 1; until gesamt_einheit <= i; data1[cd1] := 5; data2[cd2] := 5; data3[cd3] := 5; data4[cd4] := 5; data5[cd5] := 5; data6[cd6] := 5; data7[cd7] := 5; data8[cd8] := 5; {cd1 := 1; repeat Form1.Memo1.Lines.Add(inttostr(data1[cd1])); Form1.Memo1.Lines.Add(inttostr(data1[cd1+1])); cd1 := cd1 + 2; until data1[cd1] = 5; } cd1 := 1; repeat Form1.Memo1.Lines.Add(inttostr(data1[cd1])); Form1.Memo1.Lines.Add(inttostr(data1[cd1+1])); cd1 := cd1 + 2; until (data1[cd1] = 5) or (data1[cd1-2] = 5); cd2 := 1; repeat Form1.Memo1.Lines.Add(inttostr(data2[cd2])); Form1.Memo1.Lines.Add(inttostr(data2[cd2+1])); cd2 := cd2 + 2; until (data2[cd2] = 5) or (data2[cd2-2] = 5); cd3 := 1; repeat Form1.Memo1.Lines.Add(inttostr(data3[cd3])); Form1.Memo1.Lines.Add(inttostr(data3[cd3+1])); cd3 := cd3 + 2; until (data3[cd3] = 5) or (data3[cd3-2] = 5); cd4 := 1; repeat Form1.Memo1.Lines.Add(inttostr(data4[cd4])); Form1.Memo1.Lines.Add(inttostr(data4[cd4+1])); cd4 := cd4 + 2; until (data4[cd4] = 5) or (data4[cd4-2] = 5); cd5 := 1; repeat Form1.Memo1.Lines.Add(inttostr(data5[cd5])); Form1.Memo1.Lines.Add(inttostr(data5[cd5+1])); cd5 := cd5 + 2; until (data5[cd5] = 5) or (data5[cd5-2] = 5); Form1.Memo1.Lines.Add(' |-| '); {repeat if Store_Buffer[i] <> alter_wert then begin Form1.Memo1.Lines.Add(inttostr(Store_Buffer[i])+','+inttostr(i)+','); if(Store_Buffer[i] = 1) then begin data[counter] := 1; data[counter + 1] := i; counter := counter + 2; end; if(Store_Buffer[i] = 0) then begin data[counter] := 0; data[counter + 1] := i; counter := counter + 2; end; alter_wert := Store_Buffer[i]; end; i := i + 1; until gesamt_einheit <= i; data[counter] := 748575; } end; procedure TForm1.draw_raw_data(drawspace:TImage;color:TColor;data_in:MyData); var counter:integer; begin counter := 1; repeat draw_up(drawspace,color,((data_in[counter+1] - start) div ein_pixel)); if data_in[counter - 2] = 1 then draw_line(drawspace,color,(data_in[counter-1]-start) div ein_pixel,(data_in[counter+1] - start) div ein_pixel,5); if data_in[counter - 2] = 0 then draw_line(drawspace,color,(data_in[counter-1]-start) div ein_pixel,(data_in[counter+1] - start) div ein_pixel,25); counter := counter + 2; until (data_in[counter] = 5) or(data_in[counter-2] = 5) ; if data_in[counter - 2] = 1 then draw_line(drawspace,color,(data_in[counter-1]-start)div ein_pixel,gesamt_einheit div ein_pixel,5); if data_in[counter - 2] = 0 then draw_line(drawspace,color,(data_in[counter-1]-start)div ein_pixel,gesamt_einheit div ein_pixel,25); end; procedure TForm1.clear_disp(disp:TImage); begin with disp.canvas do begin brush.Color:=$00575048; brush.Style:=bsSolid; rectangle(0,-1,disp.Width+2,disp.Height+2); end; end; procedure TForm1.clear_all; begin clear_disp(Form1.Image9); clear_disp(Form1.Image12); clear_disp(Form1.Image13); clear_disp(Form1.Image14); clear_disp(Form1.Image15); clear_disp(Form1.Image16); clear_disp(Form1.Image17); clear_disp(Form1.Image18); end; procedure TForm1.FormCreate(Sender: TObject); begin version_t := '1.0.0.21'; form1.DoubleBuffered := true; end; procedure TForm1.FormShow(Sender: TObject); begin FT_Enable_Error_Report := true; // Error reporting = on gesamt_einheit := 50000; //Anzahl Samples buffer_size := 1000; //Anzahl Samples pro übertragung start := 0; stop := gesamt_einheit; ein_pixel := gesamt_einheit div Image9.Width; main_color := clWhite; //DevicePresent end; procedure TForm1.KeineAktualisierungverfgbar1Click(Sender: TObject); begin Form3.Showmodal; end; procedure TForm1.marker1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin refresh_marker(X,marker1,dispmarker1); end; procedure TForm1.marker2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin refresh_marker(X,marker2,dispmarker2); end; procedure TForm1.update_checkTimer(Sender: TObject); begin update_check.Enabled := false; if paramstr(1) = 'update' then begin deletefile(extractfilepath(paramstr(0))+'old.exe'); showmessage('Herzlichen Glückwunsch... Update erfolgreich! Version: ' + version_t); end; end; end. |
AW: wo kommt das type hin?
Gibt es eine beschränkung für die grösse von arrays?
|
AW: wo kommt das type hin?
Wenn Du jetzt noch dazu schreibst, wo Dir konkret Werte "verloren" gehen, könnte man sich das genauer anschauen. Das Programm ist allerdings für meinen Geschmack durch zu viel copy and paste reichlich unübersichtlich.
Man sollte beim Erstellen von Programmen wo es geht Schleifen und arrays verwenden, statt mittels copy and paste gewaltige Codemengen zu produzieren - so ein Programm ist nämlich wesentlich fehleranfälliger und schwerer zu warten, und die Fehlersuche ist viel mühsamer, weil einfach viel mehr Code zum Überprüfen da ist. Also z.B. statt
Delphi-Quellcode:
einfach
temp_data[0] := Store_Buffer[i] mod 2;
temp_wert := Store_Buffer[i] div 2; temp_data[1] := temp_wert mod 2; temp_wert := temp_wert div 2; temp_data[2] := temp_wert mod 2; temp_wert := temp_wert div 2; temp_data[3] := temp_wert mod 2; temp_wert := temp_wert div 2; temp_data[4] := temp_wert mod 2; temp_wert := temp_wert div 2; temp_data[5] := temp_wert mod 2; temp_wert := temp_wert div 2; temp_data[6] := temp_wert mod 2; temp_wert := temp_wert div 2; temp_data[7] := temp_wert mod 2;
Delphi-Quellcode:
Wenn Du statt data1, data2, data3... und cd1, cd2, cd3...
temp_wert := store_Buffer[i];
for a := 0 to 7 do begin temp_data[a] := temp_wert mod 2; temp_wert := temp_wert div 2; end; Felder Data: array [1..8] und cd: array[1..8] verwendest, und den immer wiederkehrenden Code in eine Schleife legst, würde das Program um einiges übersichtlicher werden. Noch ein nono:
Delphi-Quellcode:
.
if dispmarker1.Visible = true then
Statt dessen:
Delphi-Quellcode:
.
if dispmarker1.Visible then
Es würde natürlich auch so gehen:
Delphi-Quellcode:
.
if ((((dispmarker1.Visible = true) = true) = true) = true) then
Sollte die repeat-Schleife in prepaire_data nicht doch eher eine for Schleife sein - ich meine, steht die Anzahl der Durchläufe nicht schon zu Schleifenbeginn fest? In dem Fall entspricht die Verwendung einer repeat Schleife nämlich einer Täuschung des Gegners :) edit: Irgendwie versteht die Forumsoftware meine delphi tags nicht |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 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 by Thomas Breitkreuz