2014-02-11 5 views
0

У меня есть то, что я считаю простой проблемой, просто не могу опустить голову.Значение TEdit для переменной

Пытается написать сценарий с одной страницей.

Комбобокс и поле редактирования.

Комбобокс работает нормально, я могу получить его содержимое в зависимости от того, что было выбрано.

Моя панель редактирования, однако, я не могу ее обновить, если текст в поле изменен.

[Code] 
var 

server: string; 

procedure InitializeWizard; 
var 
Edit: TNewEdit; 

begin 
    server := '127.0.0.1'; 

    Edit := TNewEdit.Create(CustomPage); 
    Edit.Top := DescLabel2.Top + DescLabel2.Height + 6; 
    Edit.Width := CustomPage.SurfaceWidth div 2 - ScaleX(8); 
    Edit.Text := server; 
    Edit.Parent := CustomPage.Surface; 

Невозможно выяснить, что я делаю неправильно.

+0

Извините, но это для меня не имеет смысла. Какова ваша цель? Почему вы хотите отслеживать текст поля редактирования с помощью переменной? Вы можете прочитать или обновить эту переменную, прежде чем использовать ее. В вашем текущем коде вы создаете окно редактирования и назначаете текст из переменной 'server', не более того. – TLama

+0

Я хотел иметь текстовое поле с IP-адресом по умолчанию в нем, но также хочу, чтобы он был обновлен. Затем этот IP-адрес будет использоваться в разделе реестра позже в скрипте. Я просто не могу заставить его обновлять, если кто-то вводит измененный текст, уже установленный. – copyandpaster

+0

Ну, тогда вам действительно не нужна эта переменная. Проверьте ['этот пример'] (http://pastebin.com/UUN0HLNE), чтобы узнать, почему. Можно было бы сделать именно то, что вы просили, но это было бы неправильно. Так называемые [скриптовые константы] (http://jrsoftware.org/ishelp/topic_scriptconstants.htm) - правильный путь. – TLama

ответ

0

Может быть, часть моего кода поможет:

// The name of the virtual machine 
Edit1 := TEdit.Create(WizardForm); 
with Edit1 do 
begin 
    Parent  := Panel3; 
    Left  := ScaleX(Offset); 
    Top  := ScaleY(0*LineHeight) + ScaleY(5); 
    Width  := ScaleX(145); 
    Height  := LineHeight; 
    Text  := ''; 
    ShowHint := True; 
    Hint  := ExpandConstant('{cm:VBoxConfig1Hint}'); 
    TabOrder := 0; 
    OnExit  := @GetVM_Name; 
    OnKeyPress := @CheckEditInput; 
end; 

Отметьте OnExit !! этот кусок забыл про программировать.

Procedure GetVM_Name(Sender: TObject); 
// Get the machineName 
{} 
begin 
VirtualMachineName := AddQuotes(Edit1.Text); 
end; 

Чтобы избежать нежелательного ввода, создайте процедуру проверки. Пример выглядит так:

Procedure CheckEditInput(Sender: TObject; var Key: char); 
// This procedure checks if the character entered is a wanted one 
{} 
begin 
if (Key = '{') or (Key = '}') or (Key = '<') or (Key = '>') then 
    begin 
    Beep; 
    Key := #0; 
    end; 
if (Key = '[') or (Key = ']') or (Key = '`') or (Key = '~') then 
    begin 
    Beep; 
    Key := #0; 
    end; 
if (Key = '(') or (Key = ')') or (Key = '#') or (Key = '%') or (Key = '*') then 
    begin 
    Beep; 
    Key := #0; 
    end; 
if (Key = ';') or (Key = ':') or (Key = ',') or (Key = '?') or (Key = '@') then 
    begin 
    Beep; 
    Key := #0; 
    end; 
end; 
+0

Вы можете «сократить» свое условие до 'if Key in ['{', '}', '<', '>', '[', ']', '' '', '~', '(', ')' , '#', '%', '*', ';', ':', ',', '?', '@'] then'. Кроме того, нет необходимости оценивать «ключ» четыре раза, я имею в виду, что вы могли бы написать его сразу из операторов 'или'. – TLama

Смежные вопросы