#delphi
Вопрос:
Я делаю toggle switch
то , что, когда я нажимаю на него , он меняет свое On/off
состояние, я создал его, переопределив Paint
метод TCanvas
, все в порядке, но границы выглядели неровными.
Поэтому я изменил компонент, чтобы загружать изображение для каждого состояния в зависимости от состояния изображения, короче говоря, я помещаю TImage
компонент внутри Checkbox
унаследованного от TwwCheckbox
Но когда изображение будет нажата/нажата/выбрана, Checked
меняет свое состояние в true, но он не показывает то состояние, которое было сохранено в базе данных в следующий раз, когда я снова откройте форму, я имею в виду, если я запускаю toggle
его сохраняется С S
и при открытии формы, в которой Toggle
он должен быть включен и не выключен
{here I create the toggle in runtime and assign it a datasource
to connect it to the database}
procedure TForm1.FormCreate(Sender: TObject);
begin
ToggleButton:= TinToggleButton2.Create(Self);
ToggleButton.Name := 'ToggleButton';
ToggleButton.Parent:= Self;
ToggleButton.Left:= 200;
ToggleButton.Top:=100;
ToggleButton.Visible:= true;
ToggleButton.ValueChecked:= 'S';
ToggleButton.ValueUnchecked:= 'N';
ToggleButton.DisplayValueChecked:= 'S';
ToggleButton.DisplayValueUnchecked:= 'N';
ToggleButton.DataField:= 'TAutoSave';
ToggleButton.DataSource:= dsToggleButton;
ToggleButton.DataSource.DataSet:= qryToggleButton;
end;
//here the query
procedure TForm1.Button1Click(Sender: TObject);
begin
qryToggleButton.Active:= true;
end;
//i send the data to database
procedure TForm1.Button2Click(Sender: TObject);
begin
qryToggleButton.Post;
end;
{here I create the component in another unit where the click event is
to switch between image}
constructor TinToggleButton2.Create(AOwner: TComponent);
begin
inherited;
Width:= 34;
Height:= 15;
Image:= TImage.Create(Self);
Image.Visible:= true;
Image.Picture.LoadFromFile('toggle_Toggle1.ico');
Image.Parent:= Self;
Image.OnClick:=Self.Image1Click;
Self.Checked:= false;
Checked:= false;
end;
procedure TinToggleButton2.Image1Click(Sender: TObject);
begin
if DataSource <> nil then
begin
DataSource.Edit;
if Self.Checked then
begin
Self.Checked:= false;
DataSource.DataSet.FieldByName(DataField).Value:= ValueUnchecked;
Image.Picture.LoadFromFile('toggle_Toggle1.ico');
end
else
begin
Self.Checked:= true;
DataSource.DataSet.FieldByName(DataField).Value:= ValueChecked;
Image.Picture.LoadFromFile('toggle_Toggle2.ico');
end;
end;
end;
Я создаю переключатель во время выполнения, но я помещаю другие компоненты, такие как TwwDataSource
«и TADOQuery
«, в форму и устанавливаю DataField
DataSource
флажок «и».
Комментарии:
1. FillPath, SolidBrush-это в основном просто методы GDI из api win 32, поэтому в Delphi были бы эквиваленты, если бы вы, скорее всего, не могли напрямую вызвать api
2. Используя Delphi, класс TCanvas реализует GDI. Графические компоненты имеют свойство Canvas, которое вы можете использовать в своей программе рисования.
3. Вы переводите набор данных в режим редактирования или вставки, вызывая его
Edit
илиInsert
методы, а не вызываяOpen
. Сначала его нужно открыть, а затем либо отредактировать, либо вставить новую строку. Вы не можете позвонитьPost
, если вы сначала не позвонили илиEdit
илиInsert
, и должны звонить толькоPost
в том случае, если данные действительно были изменены.4. @KenWhite да , но компонент вставляется
edit state
каждый раз, когда я меняюcheckbox
, то, что я сделал, былоif DataSource <> nil then DataSource.Edit
и вChecked
немDataSource.DataSet.FieldByName(DataField).Value:= ValueUnchecked
, и это работает