Q&A

  • 동적 생성시 문제
동적 생성시 ..화면에 표현하는 progressbar의 갯수와 label을 갯수가 틀립니다
글런데 만약에 6개가 표현되는것을 클릭하고
12개가 표현되는걸 클릭했는데
다시 6개가 클릭하는걸 클릭하면 6개만 클릭되는것이 아니라 12개중 6개만 그에 값에 맞게 표현됩니다
만약 화면에 지우고 다시 그릴수가만 있으면 좋겠는데
고수님들의 조언 부탁 드립니다

unit DBAmount;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons, jpeg, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdWhois, TeEngine, Series, TeeProcs, Chart,
TeeURL, TeeSeriesTextEd, XiProgressBar,DB,DBTables;

type
   TfrmDBAmount = class (TForm)
   Panel1: TPanel;
   Image2: TImage;
   Label1: TLabel;
   Label2: TLabel;
   edtDBIP: TImage;
   cboDBNM: TComboBox;
   Label5: TLabel;
   Label6: TLabel;
   Label7: TLabel;
   Shape1: TShape;
   edtDBIP2: TEdit;
   Label8: TLabel;
   Shape6: TShape;
   sbtn_f12: TSpeedButton;
   Shape2: TShape;



   procedure SBtn_Click(Sender: TObject);
   procedure FormKeyPress(Sender: TObject; var Key: char);
   procedure cboDBNMChange(Sender: TObject);



private
   { Private declarations }
public
   { Public declarations }
   DBqry : String;


end;

var
frmDBAmount: TfrmDBAmount;

implementation

uses DataModule;

{$R *.dfm}

procedure TfrmDBAmount.SBtn_Click(Sender: TObject);
var
ALine, AResult: string;
iPos: integer;
begin
case (Sender as TSpeedButton).Tag of

   1:
     Self.Close;
end;
end;

procedure TfrmDBAmount.FormKeyPress(Sender: TObject; var Key: char);
begin
case Key of
   #27:
     Self.Close;
end;
end;

procedure TfrmDBAmount.cboDBNMChange(Sender: TObject);
var
StrSql : String;
ProgressBar : TXiProgressBar;
i : integer;
DBTitle : TLabel;
persent : TLabel;
Leftvalue : integer;
progressBarTop,labelTop : integer;
qryStr : TQuery;
begin
try
case cboDBNM.ItemIndex +1 of
   1:
   begin
     qryStr := TQuery.Create(nil);
     qryStr := Dm.qryTemp;
   end;
   2:
   begin
     qryStr := TQuery.Create(nil);
     qryStr := Dm.qryBASTmp;
   end;
   3:
   begin
     qryStr := TQuery.Create(nil);
     qryStr := Dm.QryBackTmp;
   end;
  end;
  with qryStr do
  begin
     close;
     sql.Clear;
     StrSql := 'select f.tname "TableSpace",  '+
               'round(sum(d.bytes)/1000000, 0) "Total(M)", '+
               'round((sum(d.bytes) - sum(f.bytes))/1000000, 0) "UsedSpace(M)", '+
               'round((sum(d.bytes) - sum(f.bytes))/sum(d.bytes)*100, 0) "Used(%)", '+
               'round(sum(f.bytes)/1000000, 0) "FreeSpace(M)" '+
               'from '+
               '(select sum(bytes) bytes, '+
               'tablespace_name tname '+
               'from dba_free_space '+
               'group by tablespace_name) f, '+
               '(select sum(bytes) bytes, '+
               'tablespace_name tname '+
               'from dba_data_files '+
               'group by tablespace_name) d '+
               'where f.tname = d.tname '+
               'group by f.tname ';
     sql.Add(StrSql);
     open;
     //showMessage(FieldByName('TableSpace').AsString);
     i := 1;
     progressBarTop := 70;
     labelTop := 76;
     frmDBAmount.Refresh;

     while NOT EOF do
     begin
     {*************************************************************************
                      2005.10.4 yj cho
                      TXiprogressBar 객체 생성및 속성 설정
     *************************************************************************}
       ProgressBar := TXiProgressBar.Create(nil);
       DBTitle := TLabel.Create(nil);
       persent := TLabel.Create(nil);
       if (i mod 2 = 1)  then
       begin
         leftvalue := 0;
         progressBarTop := progressBarTop + 30;
         labelTop := labelTop + 30;
       end
       else
       begin
         leftvalue := 481;
       end;
       with DBTitle do
       begin
         visible:=False;
         parent := self;
         Left := 40 + leftvalue;
         Top := labelTop;
         Width := 60;
         Height := 12;
         caption := FieldByName('TableSpace').AsString;
         visible:=true;
       end;
       with ProgressBar do
       begin
         visible:=False;
         Top := ProgressBarTop;
         parent := Self;
         Left := 120 + leftvalue;
         Width := 351;
         Height := 16;
         ColorBorder := 2214;
         BackColorGrad := clWhite;
         BackColorFace := 13036799;
         ForeColorFace := 10215167;
         ForeColorGrad := 31671;
         ColorScheme := csDesert;
         Max := 100;
         Min := 0;
         Step := 1;
         Position := FieldByName('Used(%)').AsInteger;
         visible:=true;
       end;
       with persent do
       begin
         visible:=False;
         parent := self;
         left := 481 + leftvalue;
         top := labelTop;
         width := 18;
         height := 12;
         Caption := FieldByName('Used(%)').AsString + '%';
         visible:=true;
       end;
       i := i+1;
       next;
     end;
   end;
   finally
     //qryStr.Free;
     showMessage('해지');
     ProgressBar.Free;
     DBTitle.Free;
     persent.Free;

   end;
end;

end.
1  COMMENTS
  • Profile
    이중철 2005.10.07 20:57
    잠시 대충 보았는데요
    ProgressBar := TXiProgressBar.Create(nil);
    DBTitle := TLabel.Create(nil);
    persent := TLabel.Create(nil);

    이 문장은 While문 안쪽에 있고

    이것을 해제하는 것은 While문 바깥쪽에 있네요

    이 문장을 보면 결국  100개를 생성하더라도 마지막 한건만 해재하고 나머지들은 놔두는 것 같은데요

    이 함수가 끝날때에 생성된 UI객체를 삭제하느냐 마느냐가 큰 관건인데

    만약 전자라면

    While 안쪽에 에 Free문을(문제점은 화면에 보여지는 것은 오로지 하나임)  넣으시던지

    바깥쪽에서 일괄적으로 Free시켜주는 것을 넣어 주세요

    Finally 구문에서 1건 Free가 아니라 전체 생성된것들 Free

    아니라면 다음과 같아야 합니다.

    ProgressBar := TXiProgressBar.Create(self);
    DBTitle := TLabel.Create(self);
    persent := TLabel.Create(self);

    바꾸시고(폼 해제시 자동해제)

    Function Call 시 기존에 생성되었던 객체를 삭제하셔야 합니다.

    그럼 이만 즐코