小编Gle*_*rse的帖子

自定义对话框

尝试使用按钮名称weapon1,weapon2和cancel来使用自定义对话框.但是,当我尝试编译它时,使用此代码将结果显示为未定义错误消息是

[DCC错误] ssClientHost.pas(760):E2003未声明的标识符:'结果'

代码是:

      with CreateMessageDialog('Pick What Weapon', mtConfirmation,mbYesNoCancel) do
       try
           TButton(FindComponent('Yes')).Caption := Weapon1;
           TButton(FindComponent('No')).Caption := Weapon2;
           Position := poScreenCenter;
           Result := ShowModal;
        finally
     Free;
   end;
     if buttonSelected = mrYes    then ShowMessage('Weapon 1 pressed');
     if buttonSelected = mrAll    then ShowMessage('Weapon 2 pressed');
     if buttonSelected = mrCancel then ShowMessage('Cancel pressed');
Run Code Online (Sandbox Code Playgroud)

delphi

1
推荐指数
1
解决办法
3944
查看次数

创建复选框

我正在尝试创建一些复选框,有多少是由查询的recordcount决定的.此外,我需要从上一个位置设置复选框+38的位置.有人给我一些帮助吗?不知道如何创建复选框,剩下的我应该能够做到......无论如何他是我迄今为止所拥有的.

var
  i, top,left : integer;
begin
......
    left := 81;
    top := 119;
    while i < qry.RecordCount do
                  begin
                    // create check box
                    // set caption of checkbox to i
                    // set checkbox loction to left + 38, top
                    // left = left+38??
                  end;
Run Code Online (Sandbox Code Playgroud)

delphi

1
推荐指数
2
解决办法
2754
查看次数

从组合框中删除重复项

说我有一个组合框

apples
apples
pears
oranges
oranges
Run Code Online (Sandbox Code Playgroud)

我想让它显示出来

apples
pears
oranges
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

delphi

1
推荐指数
1
解决办法
6105
查看次数

如何使用单独的Label.Caption更新来安装某些Control.OnMouseEnter事件

我有12个形状

Shape1
Shape2
.....
Shape12
Run Code Online (Sandbox Code Playgroud)

我有12个标签

Label13
Label14
......
Label24
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法编写这样的函数,鼠标在形状上输入会将相应的标签分配给不同的标签,例如Label25:

Label25 :=  
OnMouseEnter
shape1 -> label13
shape2 -> label14
...
shape12 -> label24
Run Code Online (Sandbox Code Playgroud)

因此,如果鼠标输入Shape1,Label25将等于Label13,如果鼠标输入Shape2,Label25将等于Label14并继续,直到鼠标输入Shape12 Label25将等于Label24.

我知道我可以写

label25 := labelxx 
Run Code Online (Sandbox Code Playgroud)

在每个鼠标输入事件.但是认为标签和形状的名称相对应可以有一种更简单的方式,其中标签#比形状#thetime多12个.

添加建议后,我添加了这个

procedure TFZone1Mod7.ChangeText(sender: TObject);
var
  ShapeOrderNo: integer;
  FoundComponent: TComponent;
begin
  if TryStrToInt(copy(TShape(Sender).Name,6,MaxInt),ShapeOrderNo) then
    begin
      FoundComponent := FindComponent('label'+inttostr(ShapeOrderNo+12));
      if (FoundComponent is TLabel) then
            Label25.Caption := TLabel(FoundComponent).Caption
      else
          showmessage('not found');
    end;
  showmessage('failed try');

end;

procedure TFZone1Mod7.Shape1MouseEnter(Sender: TObject);
begin
    changetext(self);
end;

end.
Run Code Online (Sandbox Code Playgroud)

但每次跑步我都会失败尝试.我发错的信息了吗?

delphi delphi-xe2

1
推荐指数
1
解决办法
710
查看次数

获取当前表单的名称

我在表格上有一个按钮.
按钮名称是bmod2,而表单名称是fLayOut1

当用户单击按钮时,我想保存当前表单和按钮名称的名称

procedure TFLayout1.bMod2Click(Sender: TObject);
var
azone : string;
adept : string;
begin
azone := //forum name here
adept := //button name here
end;
Run Code Online (Sandbox Code Playgroud)

forms delphi delphi-xe2

1
推荐指数
1
解决办法
4601
查看次数

在运行时创建对象命名

假设我有一个名为TMachine的类我目前正在创建一个类

 Machine := MachineShape.TMachine.create(self);
Run Code Online (Sandbox Code Playgroud)

但我需要更多的1,从来没有真正确定我需要多少,因为它取决于当时数据库中的机器数量,应该永远不会超过20.所以我知道我需要在var部分中使用某种类型的数组.目前我有

procedure TFLayout1.GetClick(Sender: TObject);
var
  machine : TMachine;
begin
 .....

  //gets number of machines in total
  while not fdeptlayout.ADOQuery1.Eof do
    begin
      fdb.count := fdb.count+1;
      fdeptlayout.ADOQuery1.Next;
    end;

  //restarts back at first query
  fdeptlayout.ADOQuery1.First;


  //creates the shape
  while not fdeptlayout.ADOQuery1.Eof do
    begin
        machine := MachineShape.TMachine.Create(self);
        machine.PlaceShape(44,44,'CM402','first','123/33/123');
        fdeptlayout.ADOQuery1.Next;
    end;
end;
Run Code Online (Sandbox Code Playgroud)

目前,这将在表格上放置1台机器"Machine".我需要它放置"Machine1""Machine2"...查询中有多少人.因此"machine"需要用数组代替一些怎么样?一切都是在运行时创建的.

delphi delphi-xe2

1
推荐指数
1
解决办法
383
查看次数

在鼠标上输入TShape

我有一个TMachine类,这是一个TShape类

unit MachineShape;


interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, extctrls,myDataModule,Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type

TMachine = class(TShape)
  private
    { Private declarations }
  public
    { Public declarations }
    procedure PlaceShape(sizeW,sizeH :integer; name, order,asset : string);
  end;
implementation



    Procedure TMachine.PlaceShape(sizeW,sizeH :integer; name, order,asset : string);
    begin
       self.width :=  sizeW;
       self.height := sizeH;
       self.top := 136;
       self.left := MyDataModule.fDB.LastX +2;//set left
       MyDataModule.fDB.lastx := left + sizeW;
    end;



end.
Run Code Online (Sandbox Code Playgroud)

我如何为此添加onmouseenter代码?因此,当在运行时添加形状时,它将有自己的鼠标输入代码.这样的东西,我知道这不会工作..但也许它会告诉你我想做什么?因此,当我创建一个TMachine时,我会将名称和编号传递给此过程,它将使onmouseenter过程更新为我发送的名称/编号.

Procedure TMachine.EditMouseEnter(name,number :string);
begin
   ....onmouseenter(Label2.Caption := name AND label3.caption := Number)...
end
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe2

1
推荐指数
1
解决办法
1120
查看次数

添加到数据库不起作用

我查询资产编号是否在数据库中,它返回false,因此我想将数据添加到数据库,我没有错误.但它永远不会添加数据.

  //check if its there, if so update it, if not add it.
if fdeptlayout.adoquery1.IsEmpty then
begin
  showmessage('adding new machine to db');
  with Fdeptlayout.ADOQuery1 do
    begin
    sql.Clear;
    sql.BeginUpdate;
    sql.add('INSERT INTO MList ');
    sql.Add('(Zone,Dept,Number,Name,Asset,IsPanel');
    sql.Add(',FinalLocation,Left,Top) ');
    sql.Add('VALUES ( :Zone, :Dept, :Number, :Name, :Asset, :IsPanel');
    sql.Add(', :FinalLocation, :Left, :Top)');
    sql.EndUpdate;
    Parameters.ParamByName('Zone').Value  := CZone;
    Parameters.ParamByName('Dept').Value  := CDept;
    Parameters.ParamByName('Number').Value := CNumber;
    Parameters.ParamByName('Name').Value  := CName;
    Parameters.ParamByName('Asset').Value := CAsset;
    Parameters.ParamByName('IsPanel').Value := CIsPanel;
    Parameters.ParamByName('FinalLocation').Value := CFinalLocation;
    Parameters.ParamByName('Left').Value := CLeft;
    Parameters.ParamByName('Top').Value := CTop;
    open;
Run Code Online (Sandbox Code Playgroud)

delphi ado

1
推荐指数
1
解决办法
389
查看次数

了解ScrollBox Range

我不明白如何调整滚动条的范围.说我有 image1 : TImage;一个TScrollingWinControl组件.

现在开始我将range =设置为组件的默认大小,就像这样.

  width := Image1.width ;
  height := Image1.Height;
  HorzScrollBar.Range := Image1.Width;  
  VertScrollBar.Range := Image1.Height;
Run Code Online (Sandbox Code Playgroud)

到了这里,我相信我很好.一切看起来都不错,没有滚动条会像我想的那样出现.现在我只使图像更大,但组件保持相同的大小像这样.

 Image1.height := Image1.Height +100;
 Image1.Width  := Image1.Width  +200;
Run Code Online (Sandbox Code Playgroud)

现在我可以告诉我的图像更大,组件大小相同但滚动条从不显示.所以对于他们来说,我需要设置范围,这让我感到困惑

  1. 如果窗体的垂直滚动条的范围设置为500,并且窗体的高度为200,则滚动条的位置可以在0到300之间变化.

所以这里是我困惑的地方,我采取image1.height - 组件高度并将其设置为范围?或整个Image1.height和滚动条的范围减去?

delphi

1
推荐指数
1
解决办法
3650
查看次数

十六进制网格的计算

我想做的是创建一个如下所示的十六进制网格.

六角网格

我可以绘制十六进制但不确定如何让他们错开.因此第一行应该是图像中的(0,0)(0,1)(0,2)(0,3),第二行应该是(1,0)(1,1)(1,2)( 1,3)等行中的偶数十六进制总是错开.

目前我知道要使用的行/列数 hexRows hexColumns

以及我如何绘制十六进制是这样的,i只是在绘制十六进制数时. DrawSolidHex(x,y,i);

当前代码看起来像这样

 begin
 hexcolumns := c;
 hexrows := r;
 i:=1;             //first cube
 x := 1;           //default x,y,z values
 y := 1;
 z := 0;
   while hexrows>0 do
    begin
      columnssave := hexcolumns ;
      while hexcolumns >0 do
        begin
          DrawSoildHex(X,Y,i);
          i:=i+1;
          x := x + 1; 
          hexcolumns := hexcolumns -1;
        end;
      y:=y+1;
      x:= 1;
      z:=0;
      hexcolumns := columnssave;
      hexrows:= hexrows-1;
    end;
    totalhex := i;
Run Code Online (Sandbox Code Playgroud)

目前使用此代码,它只会在直线上绘制十六进制x,y,(1,1)(2,1)(3,1)...等我不确定如何添加偏移,计算它们和代码所以它会错开行.

delphi hexagonal-tiles delphi-xe2

1
推荐指数
1
解决办法
1084
查看次数

标签 统计

delphi ×10

delphi-xe2 ×5

ado ×1

forms ×1

hexagonal-tiles ×1