Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   wo kommt das type hin? (https://www.delphipraxis.net/152055-wo-kommt-das-type-hin.html)

hedie 9. Jun 2010 17:28

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:
type TArray: array[1..5] of Integer;
Doch leider weiss ich nicht, wo ich diese Zeile hinpacken soll.
Es wird dauernd rot unterstrichen...

Danke für die Hilfe

DenSchub 9. Jun 2010 17:33

AW: wo kommt das type hin?
 
Richtig würde es lauten:
Delphi-Quellcode:
TArray = array[1..5] of Integer;
Und es kommt dort hin, wo auch
Delphi-Quellcode:
TForm1 = class(TForm)
zu finden ist. Wahlweise davor oder nach dem entsprechenden
Delphi-Quellcode:
end;

[edit]Wenn der Inhalt global verfügbar sein soll, auch daran denken, ihn in der
Delphi-Quellcode:
var
-Sektion zu definieren.[/edit]
[edit2]Übrigens: Ein Typ zu definieren ist eigentlich gar nicht notwendig, wenn es nur um die Globalisierung geht.[/edit2]

Ich liebe inline-codes. *pfeif*

s.h.a.r.k 9. Jun 2010 17:37

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 ;)

himitsu 9. Jun 2010 17:37

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.

s.h.a.r.k 9. Jun 2010 17:39

AW: wo kommt das type hin?
 
Zitat:

Zitat von himitsu (Beitrag 1027438)
TArray kennen neuer Delphi z.B. schon und dieses stimmt mit deiner Definition nicht überein.

Wobei das aufgrund verschiedener Namespaces in sehr wenigen Umständen okay wäre, aber du hast da auf jeden Fall recht. Sinnvolle Namen sind ein absolutes DO.

hedie 9. Jun 2010 18:26

AW: wo kommt das type hin?
 
Vielen Dank

es hat teilweise geklappt...

Ich hab folgendes Definiert:

Delphi-Quellcode:
MyData = array[1..100000] of integer;

public
data1,data2,data3,data4,data5,data6,data7,data8: MyData;
doch leider "verlieren" gewisse arrays auf unerklärliche weise Daten
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

s.h.a.r.k 9. Jun 2010 18:29

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.

hedie 9. Jun 2010 18:33

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.

hedie 9. Jun 2010 19:43

AW: wo kommt das type hin?
 
Gibt es eine beschränkung für die grösse von arrays?

idefix2 9. Jun 2010 19:53

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:
 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;
einfach

Delphi-Quellcode:
    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;
Wenn Du statt data1, data2, data3... und cd1, cd2, cd3...
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

hedie 9. Jun 2010 20:04

AW: wo kommt das type hin?
 
Zitat:

Zitat von idefix2 (Beitrag 1027495)
Wenn Du jetzt noch dazu schreibst, wo Dir konkret Werte "verloren"

Also ich denke ich "verliere" Sie bei der procedure prepaire_data

Edit: Es könnte jedoch auch bei der anschliessenden Übergabe an draw_raw_data sein

Wenn ich jedoch

Delphi-Quellcode:
 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);
Einsetze und die Arrays "gebrauche" dann verliere ich Array Daten1 und Daten2 schonmal nicht.

Zitat:

Felder Data: array [1..8] und cd: array[1..8]
Wie greife ich den danach auf ein Array zu?
Etwa so?
Delphi-Quellcode:
Data[0][0] := xyz; //Array0 Feld 0
Zitat:

Sollte die repeat-Schleife in prepaire_data nicht doch eher eine for Schleife sein
Ja du hast recht, die Schleife geht solange durch bis gesamt_einheit erreicht ist

idefix2 10. Jun 2010 00:07

AW: wo kommt das type hin?
 
Zitat:

Wie greife ich den danach auf ein Array zu?
Etwa so?
Data[0][0] := xyz; //Array0 Feld 0
ja, genau so

Heute bin ich schon müde, morgen (heute nach dem Aufstehen :) ) sehen wir weiter

hedie 10. Jun 2010 06:38

AW: wo kommt das type hin?
 
Dan sag ich mal Guten Morgen :)

himitsu 10. Jun 2010 06:51

AW: wo kommt das type hin?
 
Zitat:

Zitat von idefix2 (Beitrag 1027628)
Zitat:

Wie greife ich den danach auf ein Array zu?
Etwa so?
Data[0][0] := xyz; //Array0 Feld 0
ja, genau s

oder so
Delphi-Quellcode:
Data[0, 0] := xyz;

hedie 10. Jun 2010 07:44

AW: wo kommt das type hin?
 
Hab neuigkeiten

Wenn ich bei

Delphi-Quellcode:
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;
Nur die Daten data1 und data2 verarbeite so wie hier, dan klappt es. Also data1 und data2 werden korrekt dargestellt.
data3 hat abwechselnd immer 0 und 1 im Array
data4 - data8 haben nichts im array

idefix2 10. Jun 2010 09:29

AW: wo kommt das type hin?
 
Ich habe jetzt versucht, das Programm halbwegs zu verstehen - leider ist es so programmiert, dass es einem Aussenstehenden fast unmöglich gemacht wird, etwas zu begreifen:

Wenn ich es jetzt richtig verstanden habe, werden in data[x] und data [x+1] grundlegend verschiedene Arten von Daten abgespeichert, nämlich in data[x] daten, und Data[x+1] irgend eine Art von Index. SO GEHT ES EINFACH NICHT!

Mit irgend etwas auf die Art

Delphi-Quellcode:
var
Data: array [1..4] of record
    Datenelement: integer;
    index: integer
    end;
würde man auf Anhieb sehen, wie die Daten im Programm organisiert sind. So wie das Programm jetzt aussieht (Datenstrukturen, keine Schleifen, die falschen Schleifen) blicke ich einfach nicht durch, was gewollt ist und was passieren sollte, und wo deshalb der Fehler liegen könnte.

hedie 10. Jun 2010 09:45

AW: wo kommt das type hin?
 
Zitat:

Zitat von idefix2 (Beitrag 1027708)
Wenn ich es jetzt richtig verstanden habe, werden in data[x] und data [x+1] grundlegend verschiedene Arten von Daten abgespeichert, nämlich in data[x] daten, und Data[x+1] irgend eine Art von Index. SO GEHT ES EINFACH NICHT!

Ja das hast du richtig verstanden.

Also ich versuche es mal zu erklären...

Ziel ist es, eine darstellung wie diese zu erzeugen: http://home.netcom.com/~chip.f/viterbi/figs/ce_td.gif
Dazu verwende ich ein Image auf welches ich mit canvas zeichne.

Meine Hardware liest 50'000 mal ein ob es eine 1 oder eine 0 ist also oben oder unten. Ungeachtet dessen was es den nun ist,
werden diese 50'000 bytes übertragen. Ein byte entspricht binär 8 zuständen also zb 1001 1010 deshalb auch 8 kanäle.
Nun muss ich überprüfen wo in den 50'000 bytes eine änderung stattgefunden hat. Dazu wandle ich von Dezimal nach binär damit ich
jeden kanal "sehe" ob er 1 oder 0 war. speichere ich das abbild in einem array
Delphi-Quellcode:
Move(temp_data[0], old_data[0], Length(temp_data)); //Array kopieren
Danach mache ich die Dezimal -> Binär wandlung mit dem nächsten byte
Delphi-Quellcode:
temp_data[0] := Store_Buffer[i] mod 2;
und speichere
das ergebnis also die binär zahl in einem array.
Anschliessend vergleiche ich jede Binärstelle mit dem vorhergehenden wert. Wenn nun eine 1 anstelle der 0 steht, so weiss ich das sich der zustand damals an der leitung der hardware geändert hat.
Also speichere ich in das array data1 (für kanal 1) die änderung und damit ich weiss wo auf dem diagram speichere ich noch den index der 50'000 daten.

Dieser ist ja proportional zur zeit und gibt mir anschliessend die position wo ich den den strich nach oben oder unten zeichnen muss....

Hoffe es ist nun verständlich :)

hedie 10. Jun 2010 11:18

AW: wo kommt das type hin?
 
So ich hab mal optimiert...

Delphi-Quellcode:
procedure TForm1.prepaire_data;
  var
alter_wert,i,a,temp_wert,Kanal1_Counter:integer;
temp_data,old_data:Array[0..8] of integer;
begin

  Kanal1_Counter := 0;

  for i := 0 to gesamt_einheit - 1 do
  begin

    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;

    if temp_data[0] <> old_data[0] then begin //Prüfen ob sich der wert geändert hat.
      Kanal1[Kanal1_Counter].Pegel := temp_data[0]; //Wenn ja, neuer Wert (0 oder 1) in den Pegel von Kanal1 schreiben
      Kanal1[Kanal1_Counter].Index := i; //Index übergeben damit ich weiss wo ich zeichnen muss
      Kanal1_Counter := Kanal1_Counter + 1; //Kanal1 Counter erhöhen
    end;

    Move(temp_data[0], old_data[0], Length(temp_data)); //Array kopieren damit man anschliesend vergleichen kann

  end;

  Kanal1[Kanal1_Counter].Pegel := 2; //Terminierung des Arrays da Pegel nur 0 oder 1 sein kann

end;

Frage: Kann man da noch was optimieren?
Weil ich müsste ja eigentlich für jeden kanal wieder das selbe machen wie für kanal1


Nochmal was Optimiert:

Delphi-Quellcode:
procedure TForm1.draw_raw_data(drawspace:TImage;color:TColor;data_in:Array of TKanal);
var
counter:integer;
begin

  counter := 0;

  repeat
    draw_up(drawspace,color,((data_in[counter].Index - start) div ein_pixel));
    if (data_in[counter-1].Pegel) = 1 then draw_line(drawspace,color,(data_in[counter-1].Index-start) div ein_pixel,(data_in[counter].Index - start) div ein_pixel,5);
    if (data_in[counter-1].Pegel) = 0 then draw_line(drawspace,color,(data_in[counter-1].Index-start) div ein_pixel,(data_in[counter].Index - start) div ein_pixel,25);
    counter := counter + 1;
  until (data_in[counter].Pegel = 2); //Prüfen ob array ende erreicht ist.

  if data_in[counter -1].Pegel = 1 then draw_line(drawspace,color,(data_in[counter-1].Index-start)div ein_pixel,gesamt_einheit div ein_pixel,5);
  if data_in[counter -1].Pegel = 0 then draw_line(drawspace,color,(data_in[counter-1].Index-start)div ein_pixel,gesamt_einheit div ein_pixel,25); //Letzte linie erzeugen

 end;
EDIT:
Delphi-Quellcode:
  type
    TKanal = record
      Pegel: Byte;
      Index: integer;
    end;

Kanal1:Array[0..10000] of TKanal;
Werde nun testen ob es nun kein verlust mehr gibt

hedie 10. Jun 2010 11:31

AW: wo kommt das type hin?
 
Ich hab den Fehler eingegrenzt

Er taucht hier auf:

Delphi-Quellcode:
if temp_data[0] <> old_data[0] then begin //Prüfen ob sich der wert geändert hat.
      Kanal1[Kanal1_Counter].Pegel := temp_data[0]; //Wenn ja, neuer Wert (0 oder 1) in den Pegel von Kanal1 schreiben
      Kanal1[Kanal1_Counter].Index := i; //Index übergeben damit ich weiss wo ich zeichnen muss
      Kanal1_Counter := Kanal1_Counter + 1; //Kanal1 Counter erhöhen
    end;
Wenn ich anstelle von temp_data[0] temp_data[2] nehme gibts ne Access Violation

temp_data ist
Delphi-Quellcode:
temp_data,old_data:Array[0..8] of integer;
Ich denke das problem ist beim übergeben
Delphi-Quellcode:
Kanal1[Kanal1_Counter].Pegel := temp_data[0];
Pegel ist eine byte variable
Delphi-Quellcode:
type
    TKanal = record
      Pegel: Byte;
      Index: integer;
    end;
Was meinst du / ihr ?

EDIT: Wenn ich Pegel auf integer umstelle, gibts keine veränderung... Auch eine Access Violation bei
Code:
00406ADC 50               push eax

idefix2 10. Jun 2010 12:31

AW: wo kommt das type hin?
 
Ich habe jetzt versucht, die Datentypen und Schleifen anzupassen, allerdings nur trocken, d.h. es werden sicher noch Tipp und andere kleine Fehler im Code sein.


edit: ein paar Fehler sind mir jetzt gleich aufgefallen (i und counter, werte beim Prozeduraufruf von 1..8 statt 0..7), aber die kannst Du leicht selbst ausbessern.


Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ExtCtrls, StdCtrls, jpeg, ImgList, ComCtrls;

type
  MyData = packed array[1..50000] of packed record
    data: byte;
    index: word; // Zwei byte sind genug für 1..50000
    end;
  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; typ: integer);
    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;
    data: array[0..7] of MyData;
    Cd: array[0..7] of integer; // Aktuelle Anzahl der Elemente in Data
  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
 //  Was ist hier pen.mode?
    Pen.Color := color;
    Pen.Width := 1;
    MoveTo(x,25);
    LineTo(x,5);
 end;
end;

procedure draw_down(pointer:TImage;color:TColor;x:integer);
begin
 with pointer.Canvas do begin
    Pen.Color := color;
    Pen.Mode := pmMerge; // bei draw_up nicht?
    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
  dispmarker1.visible := not dispmarker1.visible;
  dispmarker2.Visible := dispmarker1.visible;
  marker1.Visible := dispmarker1.visible;
  marker2.Visible := dispmarker1.visible;
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,1);
  draw_raw_data(Image12,main_color,2);
  draw_raw_data(Image13,main_color,3);
  draw_raw_data(Image14,main_color,4);
  draw_raw_data(Image15,main_color,5);
  draw_raw_data(Image16,main_color,6);
  draw_raw_data(Image17,main_color,7);
  draw_raw_data(Image18,main_color,8);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  clear_all;
  prepaire_data;
  refresh_all;
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
a,h,alter_wert,counter,i:integer;
vorheriges_x,aktuelle_flanke:integer;
linie_zeichnen:boolean;
temp_data,old_data: Array[0..7] of byte;
begin
  counter := 1;
  vorheriges_x := 0;
  aktuelle_flanke := 0;
  for a := 0 to 7 do
     begin cd[a] := 0;
     old_data[a] := 0;
     end;
 
  for i := 1 to gesamt_einheit do
    begin
    h := store_Buffer[i];
    for a := 0 to 7 do
       begin
       temp_data[a] := h mod 2;
       temp_wert := h div 2;
       if temp_data[a] <> old_data[a]
       then begin inc(cd[a]);
            data[a][cd[a]].data := temp_data[a];
            data[a][cd[a]].index] := i;
            end;
       end;
    Move(temp_data[0], old_data[0], Length(temp_data)); //Array kopieren
    end;


  for a := 0 to 7 do
    begin
    if data[a][cd[a]].index <> gesamt_einheit
    then begin inc (cd[a]);
         data[a][cd[a]].index := gesamt_einheit;
         end; // damit alle 8 Graphiken bei gesamtindex enden
    Form1.Memo1.Lines.Add('Feld: '+inttostr(a));
    for i:= 1 to Cd[a] do
       Form1.Memo1.Lines.Add(inttostr(data[a][i].data)+': '+(inttostr(data[a][i].index));
    end;
  Form1.Memo1.Lines.Add(' |-| ');
end;

procedure TForm1.draw_raw_data(drawspace:TImage;color:TColor; typ: integer);
const y: array[0..1] of integer = (5,25);
var
counter:integer;
begin
  counter := 1;
  for i := 1 to Cd[typ]-1 do
    begin
    if i<>1 then draw_up(drawspace,color,((data[typ][counter+1] - start) div ein_pixel));
   // ich nehme an, zwischen drawup und drawdown ist in Wirklichkeit kein Unterschied, sonst müsste man da unterscheiden
    draw_line(drawspace,color,(data[typ][i].index - start) div ein_pixel,(data[typ][i+1].index - start) div ein_pixel,y[data[typ][i].data]);
    end;
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.

hedie 10. Jun 2010 12:40

AW: wo kommt das type hin?
 
wooow

Vielen Dank für deine extrem grosse Hilfe :)

Das sieht man selten... jemanden der einem soo sehr unter die Arme greift...

Grooses Danke!

Aber deine Dezimal zu binär Funktion ist ja im grundegenommen immer noch dieselbe...
Deshalb denke ich wird es auch da zu einer Access Violation kommen...

Was denkst du?

idefix2 10. Jun 2010 13:05

AW: wo kommt das type hin?
 
Meinst Du
Delphi-Quellcode:
       temp_data[a] := h mod 2;
       temp_wert := h div 2;
Das ist natürlich auch Unsinn, ich wollte schreiben
Delphi-Quellcode:
       temp_data[a] := h mod 2;
       h := h div 2;
Ich verwende für lokale Hilfsvariable normalerweise sehr kurze Namen, temp_wert war mir da zu lang.
Das kann keine Exception auslösen, ist ein Algorithmus aus dem Schulbuch :)
Temp_data[x] kann nur 0 oder 1 werden, dass passt ziemlich bequem in ein Byte - sollte wohl auch als array of byte deklariert werden, oder überhaupt als array of boolean, damit es klar ist, ebenso wie die Daten im Feld eigentlich vom Typ boolean und nicht byte sein sollten.

Dann würde aus dem Code oben:
Delphi-Quellcode:
       temp_data[a] := odd(h);
       h := h div 2;
und das feld zum Zeichnen wird
y: array [boolean] of integer = (5,25);

hedie 10. Jun 2010 14:39

AW: wo kommt das type hin?
 
ich hab jetzt einfach mal spasses halber den gesamten code von Seite 2 Übernommen

also komplett copy paste...

Doch leider wird gar nix dargestellt....

:(

Ich bin langsam echt am verzweifeln... Ich hab jetzt schon sooo viele stunden in diesen kack investiert und es macht nur probleme....
Gibt es denn eine Einfachere möglichkeit, wie ich mein vorhaben realisieren kann?

Ich brauche eine solche darstellung: http://home.netcom.com/~chip.f/viterbi/figs/ce_td.gif
Du weisst ja inzwischen wie ich die daten bekomme und verarbeiten muss.
Zudem sollte man die auflösung über eine scrollbar verändern können und durch das diagramm scrollen...

hedie 10. Jun 2010 15:32

AW: wo kommt das type hin?
 
Sorry ich muss mich korrigieren....


Dein Programm läuft!!!


Hab vergessen auf Draw zu klicken...

Jedoch eine kleinigkeit....

Wenn sich der zustand nie ändert also permanennt null ist sollte eine ground linie also (5) gezeichnet werden
zudem sollte am schluss auch wieder gegen null gehen also 5... Derzeit ist es so, das wenn eine leitung also kanal
einmal 1 gewesen ist ist sie dies am schluss permanent


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