2012-11-05 34 views
-1

嘗試使用一些主要模板來改變基於主編輯框中編號的組框的可見性。 EditDay是編輯框,其中只有數字在它使用整數作爲主題

day:=DayOfTheYear(Now); 
EditDay.Text:=day; 

所以它的basicaly一年的日子。 無論如何,我需要一個groupbox(有幾個備忘錄)用於每年的每一天。由於這是一個帶有記錄的文件,另一個程序將讀取每天不同的信息,我首先需要該文件編寫器,所以我甚至可以創建一個。這就是這個是 因爲我正在創建一個記錄文件,所以在我寫入文件之前必須首先填充所有的框,所以我需要一次一個顯示Groupbox,每個我在一個主要的TEdit中指定了一天。 現在我堅持設置groupboxes的可見性;下面的代碼給我訪問衝突錯誤。

x是在TEdit中指定的編號EditDay。我想每隔一天做一個y,但在EditDay框中的一天,所以除了x;

x : Integer;  
y : Integer; 

procedure TWriteForm.DayCheckTimer(Sender: TObject); 
begin 
    x:=StrToInt(EditDay.Text); 
    y:=Not x; 
    (FindComponent('GroupBox'+IntToStr(x)) as TGroupBox).Visible := True; 
    (FindComponent('GroupBox'+IntToStr(y)) as TGroupBox).Visible := False; 

試圖設置y:= [1..365]而不是x; [1..365] - x;和其他幾個人,但他們都沒有工作。

我在哪裏錯了? .. 任何幫助將不勝感激。 :))

[我有點初學者,是的..]

+1

感謝user1500049用於實時代碼視圖編輯代碼;) –

+0

你真的不希望有除了一個,Groupboxes和其他所有的都不可見?您只需要一個Groupbox和一年中的哪一天的信息。 –

+0

不,我需要其中的365個,因爲我想象要做一個記錄,因爲還沒有找到任何其他方式。 :)我有那麼多的groupbox,每個有4個備忘錄,約1500個備忘錄,(我知道這是很多的,我將不得不改變我的代碼,否則它會變得非常慢)。我需要它們的原因是因爲我將在Record中執行Write操作以將字符串寫入文件。我可以追加它們,但是我希望這樣,所以文件中每天只有一條記錄。 雖然我將在formopen中使用讀取記錄過程,所以我已經填滿了大部分。任何更好的想法? :D –

回答

0

下面一個小樣本項目來處理記錄了很多(365)遍歷您的成品的配件

For i := 1 to mCount 

,並設置公開程度。

unit RecordEdit_ViewU; 

interface 

uses 
    SysUtils, 
    Controls, Forms, Dialogs, StdCtrls, System.Classes; 

type 
    TPerson = record 
    Firstname : string[50]; // shortstring !! 
    Lastname : string[50]; // shortstring !! 
    end; 

    TRecordEdit_View = class(TForm) 
    Current_Edit : TEdit; 
    Data_Firstname_Edit : TEdit; 
    Data_Lastname_Edit : TEdit; 
    Data_Prev_Button : TButton; 
    Data_Next_Button : TButton; 
    Data_Save_Button : TButton; 
    procedure FormCreate(Sender : TObject); 
    procedure Current_EditChange(Sender : TObject); 
    procedure Data_Prev_ButtonClick(Sender : TObject); 
    procedure Data_Next_ButtonClick(Sender : TObject); 
    procedure Data_Save_ButtonClick(Sender : TObject); 
    private 
    FData : array [1 .. 365] of TPerson; 
    FCurrent : Integer; 
    procedure SetCurrent(const Value : Integer); 
    procedure InitData; 
    procedure StoreCurrent; 
    procedure LoadCurrent; 
    procedure SaveData; 
    public 
    property Current : Integer read FCurrent write SetCurrent; 
    end; 

var 
    RecordEdit_View : TRecordEdit_View; 

implementation 

{$R *.dfm} 

procedure TRecordEdit_View.Current_EditChange(Sender : TObject); 
begin 
    Current := StrToIntDef(Current_Edit.Text, 0); // convert text to integer 
end; 

procedure TRecordEdit_View.Data_Next_ButtonClick(Sender : TObject); 
begin 
    Current := Current + 1; // next record 
end; 

procedure TRecordEdit_View.Data_Prev_ButtonClick(Sender : TObject); 
begin 
    Current := Current - 1; // prev record 
end; 

procedure TRecordEdit_View.Data_Save_ButtonClick(Sender : TObject); 
begin 
    SaveData; 
end; 

procedure TRecordEdit_View.FormCreate(Sender : TObject); 
begin 
    InitData; 
end; 

procedure TRecordEdit_View.InitData; 
begin 
    FCurrent := Low(FData); // first record 
    LoadCurrent;    // load data from record 
end; 

procedure TRecordEdit_View.LoadCurrent; 
begin 
    // Data from record to controls 
    Data_Firstname_Edit.Text := FData[Current].Firstname; 
    Data_Lastname_Edit.Text := FData[Current].Lastname; 
    // Update the Current-Edit 
    Current_Edit.Text := IntToStr(Current); 
end; 

procedure TRecordEdit_View.SaveData; 
begin 
    ShowMessage('Needs to be implemented!'); 
end; 

procedure TRecordEdit_View.SetCurrent(const Value : Integer); 
begin 
    // check, if we have a change and if we can change to the new index 
    if (Value <> Current) and (Value >= Low(FData)) and (Value <= High(FData)) 
    then 
    begin 
     StoreCurrent;  // store data from controls 
     FCurrent := Value; // change current index 
     LoadCurrent;  // load data from record 
    end; 
end; 

procedure TRecordEdit_View.StoreCurrent; 
begin 
    // Data from controls to record 
    FData[Current].Firstname := Data_Firstname_Edit.Text; 
    FData[Current].Lastname := Data_Lastname_Edit.Text; 
end; 

end. 

而且形式

object RecordEdit_View: TRecordEdit_View 
    Left = 0 
    Top = 0 
    Caption = 'RecordEdit_View' 
    ClientHeight = 337 
    ClientWidth = 635 
    Color = clBtnFace 
    Font.Charset = DEFAULT_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    OnCreate = FormCreate 
    PixelsPerInch = 96 
    TextHeight = 13 
    object Current_Edit: TEdit 
    Left = 107 
    Top = 16 
    Width = 75 
    Height = 21 
    TabOrder = 0 
    Text = 'Current_Edit' 
    OnChange = Current_EditChange 
    end 
    object Data_Firstname_Edit: TEdit 
    Left = 80 
    Top = 56 
    Width = 129 
    Height = 21 
    MaxLength = 50 
    TabOrder = 1 
    Text = 'Data_Firstname_Edit' 
    end 
    object Data_Lastname_Edit: TEdit 
    Left = 80 
    Top = 83 
    Width = 129 
    Height = 21 
    MaxLength = 50 
    TabOrder = 2 
    Text = 'Data_Lastname_Edit' 
    end 
    object Data_Prev_Button: TButton 
    Left = 80 
    Top = 16 
    Width = 21 
    Height = 21 
    Caption = '<' 
    TabOrder = 3 
    OnClick = Data_Prev_ButtonClick 
    end 
    object Data_Next_Button: TButton 
    Left = 188 
    Top = 16 
    Width = 21 
    Height = 21 
    Caption = '>' 
    TabOrder = 4 
    OnClick = Data_Next_ButtonClick 
    end 
    object Data_Save_Button: TButton 
    Left = 80 
    Top = 118 
    Width = 129 
    Height = 25 
    Caption = 'Save Data' 
    TabOrder = 5 
    OnClick = Data_Save_ButtonClick 
    end 
end 

你可以得到完整的源代碼和可執行here

+0

謝謝你很多。真的,不知道如何補償你! 我對它進行了調整以適應我的代碼和表單,並在完成後回覆給您。 我想我只需要弄清楚如何連接它以保存到文件中,因爲AssignFile和Write可能不會完成這項工作,我猜...? –

+0

好吧,我認真地試着找到類似你的代碼的東西,因爲我真的不明白initdata,store,load和savedata過程(它們來自哪裏),但是我搜索了我想到的每一個可能的單詞。你能給我任何提示嗎?我不想問你的代碼,即使這可能會節省我很多,但只是一個暗示,在哪裏可以理解它,將是綽綽有餘。我成功地在代碼中實現了它,添加了更多記錄元素,並且除了將整個文件寫入文件之外,所有內容都完美無缺。 –

+0

據我發現,我需要在AssignFile和Rewrite命令後寫入命令,但是我找不到要寫入(FileVar,FData [Current])的「顯示」......到目前爲止,我總是得到空文件創建,無論我以前給他做什麼... 我真的很感謝你的幫助。這些是我從未見過的東西,但據我所知,我應該緊急地知道它們;;) –

1

view y:= Not x;在調試器中x = 1將是y = -2,您將不會找到具有此名稱的Compoentr。

您必須通過condtition

(FindComponent('GroupBox'+IntToStr(i)) as TGroupBox).Visible := y = i; 
+0

謝謝你的回覆。讓我試試這個。只是,如果我沒有問太多,你能更準確地解釋一下上面的代碼嗎?我不想但想明白爲什麼要將布爾類型設置爲整數;它是否可以正常工作,真值還是1呢? 而且,mCount是更大的數字,我猜...? 謝謝! –

+0

y = i是一個布爾表達式,如果y = i,那麼可見其他不是。 下一個「NOT」與整數必須是不明白的二進制,讓字節ist更短00001010 = 10 DEC NOT翻轉所有字節11110101這是無符號245和sigend -11 – bummi

+0

呵呵,好吧,我想我現在明白什麼是問題在我的代碼中。但不能擺脫mCount錯誤 - 粘貼時未聲明的標識符。對於x:= 1到mCount,預計只有其中的整數值。 Hinch在哪裏:/? –