全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2106
推到 Plurk!
推到 Facebook!

system 改善效能問題,請大家幫忙

尚未結案
明明知道
一般會員


發表:5
回覆:6
積分:2
註冊:2005-07-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-05 11:56:16 IP:202.64.xxx.xxx 未訂閱
各位~ 我寫了一個 system 用來記錄、加增、刪除 資料。 所用的database 是 Access connect 方法是 ado 而 access 是放在公司一個file server 上的。 我所用的平台是 window xp。 程式在我的電腦使用時效能,尚可接受。 但是在我同事的電腦運作,就佔用他的cpu 效能的 100%,使運作得不能接受地慢。 他的電腦同樣是 window xp 我想請教各位,如何令delphi 寫出的 program 效能快一些,而且佔用的 cpu 值合理些呢?
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-05 14:37:23 IP:203.69.xxx.xxx 未訂閱
導致 100% CPU? 應該是有不適當的 Loop 在空轉吧....十之八九是程式問題, 無關效能.... 方便貼上程式嗎?
明明知道
一般會員


發表:5
回覆:6
積分:2
註冊:2005-07-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-06 09:16:19 IP:202.64.xxx.xxx 未訂閱
我的 system 主要有兩個 form~    menu 和 job sheet~    menu 到 jobsheet 的時候,十分之慢~    jobsheet 回到 menu 時也是~    請大家幫忙
unit Menu;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;    type
  TForm4 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    Memo1: TMemo;
    Label1: TLabel;
    procedure ListBox1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Button1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
    procedure keypress(Sender: TObject; var Key: Char);
    procedure doubleclick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure PrepareCreate(Name : String);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form4: TForm4;
  UserName : String;    implementation
          uses jobsheet, invoiceSheet, Loginfrm;
{$R *.dfm}    procedure TForm4.Button1Click(Sender: TObject);
begin
      Form5.logout;
      application.Terminate;
{
//    MessageBox(Form4.Handle, 'Bye', 'Warning', MB_IConWARNING);        //  UserName := '';
    if (form5 <> nil)
    then
    begin
      Form5.logout;
      form5.NameTxt.text := '';
    end;         form5.Visible := true;
    close;
    }
end;    procedure TForm4.Button2Click(Sender: TObject);
begin
       if Form8 = nil then
       begin
          Form8 := tForm8.Create(self);
       end;
       Form8.ShowModal();
end;    procedure TForm4.Button3Click(Sender: TObject);
begin
   Form4.Visible := false;
   Form9.ShowModal();
end;    procedure TForm4.FormCreate(Sender: TObject);
begin
      Memo1.TabStop := False;
      Memo1.Text := 'C-TRADE COMPUTER SYSTEM CO.';          ListBox1.Items.Clear;
     // ListBox1.Items.Add('Login system');         // menuList := TStringList.Create;
      ListBox1.Items.add('----------');
      ListBox1.Items.add('    JOB ORDER FORM');
      ListBox1.Items.add('------');
      ListBox1.Items.add('    INVOICE FORM');
      ListBox1.Items.add('');
      ListBox1.Items.add('');
      ListBox1.Items.add('');
      ListBox1.Items.add('');
      ListBox1.Items.add('');
      ListBox1.Items.add('');
      ListBox1.Items.add('    GENERAL REPORTING');
      ListBox1.Items.add('----------------');
      ListBox1.Items.add('--------------');
      ListBox1.Items.add('    File Reorganization');
      ListBox1.Items.add('Log Out System');
      ListBox1.Selected[1] := true;
end;        procedure TForm4.doubleclick(Sender: TObject);
var
    sel : integer;
begin
    if (ListBox1.Selected[1] = true) then
    begin           if Form8 = nil then
       begin
          //form8
          Form8 := tForm8.Create(self);           end
       else
       begin
          Form8.precreate;
       end;
       try
       self.Visible := false;
       Form8.ShowModal();
       except
          showMessage('System Can not Open JobOrder now');
       end;
    end;
end;    procedure TForm4.PrepareCreate(Name: String);
begin
      UserName := Name;
      Label1.Caption := UserName;
end;    procedure TForm4.keypress(Sender: TObject; var Key: Char);
begin
          doubleclick(self);
end;    procedure TForm4.FormShow(Sender: TObject);
begin
      Listbox1.SetFocus;
end;    procedure TForm4.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Button1Click(sender);
end;    procedure TForm4.Button1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
        if (key = VK_ESCAPE) then
          Button1Click(sender);
end;    procedure TForm4.ListBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
     if (key = VK_ESCAPE) then
          Button1Click(sender);
      if (key = VK_RETURN) then
            doubleclick(sender);
end;    end.        unit jobsheet;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids, ExtCtrls, DBCtrls, Mask,
  ADODB, Buttons, ppVar, ppCtrls, ppPrnabl, ppClass,
  ppBands, ppDB, ppCache, ppEndUsr, ppDBPipe, ppComm, ppRelatv, ppProd, ppReport,
  RpCon, RpConDS, RpBase, RpSystem, RpDefine, RpRave;    type
  TForm8 = class(TForm)
    Button4: TButton;
    ADOConnection1: TADOConnection;
    BitBtn1: TBitBtn;
    Button8: TButton;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    ADOQuery1: TADOQuery;
    ADOTable1: TADOTable;
    DataSource2: TDataSource;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    DBEdit2: TDBEdit;
    DBEdit1: TDBEdit;
    ADOQuery1BOOKDATE: TDateTimeField;
    ADOQuery1CLIENT: TWideStringField;
    ADOQuery1STAFF: TWideStringField;
    ADOQuery1DESCRIPT1: TWideStringField;
    ADOQuery1DESCRIPT2: TWideStringField;
    ADOQuery1DESCRIPT3: TWideStringField;
    ADOQuery1EXPECTDATE: TDateTimeField;
    ADOQuery1AM_PM: TWideStringField;
    ADOQuery1M_HANDLER: TWideStringField;
    ADOQuery1SUBHANDLER: TWideStringField;
    ADOQuery1STATUS: TWideStringField;
    ADOQuery1REMARKS: TWideStringField;
    ADOQuery1LastMod: TWideStringField;
    Button2: TButton;
    GroupBox3: TGroupBox;
    DataSource3: TDataSource;
    ADOQuery2: TADOQuery;
    ADOQuery3: TADOQuery;
    ADOTable2: TADOTable;
    ComboBox2: TComboBox;
    statusCombo : TComboBox;
    GroupBox4: TGroupBox;
    GroupBox5: TGroupBox;
    GroupBox2: TGroupBox;
    ADOQuery4: TADOQuery;
    Button3: TButton;
    RvProject1: TRvProject;
    RvSystem1: TRvSystem;
    RvDataSetConnection1: TRvDataSetConnection;
    ADODataSet1: TADODataSet;
    Button5: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure DBGrid1DblClick(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
 //   procedure ADOQuery1AfterEdit(DataSet: TDataSet);        procedure statusComboSelect(Sender: TObject);
    procedure DBGrid1TitleClick(Column: TColumn);
    procedure DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure ADOQuery1CalcFields(DataSet: TDataSet);
    procedure Button1Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure OnSelect(Sender: TObject);
  //   procedure FixDBGridColumnsWidth(const DBGrid: TDBGrid);
    procedure FormCreate(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure refresh(DataSet: TDataSet);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure setFilter();
    procedure precreate();
    procedure orderby();      private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form8: TForm8;
  ListItem : TStrings;
  dtprint : tdataset;    implementation
uses  Menu, joborder, Loginfrm, selectprint, rave,test;    {$R *.dfm}    procedure TForm8.Button2Click(Sender: TObject);
begin
      dbgrid1.DataSource.DataSet.Edit;
    dbgrid1.DataSource.DataSet.Post;        Form4.Visible := true;
    close;
end;    procedure TForm8.Button5Click(Sender: TObject);    begin
      dbgrid1.DataSource.DataSet.EDIT;
      dbgrid1.DataSource.DataSet.Post;
      try
          form2.ShowModal;
      except
      end;
end;    procedure TForm8.Button4Click(Sender: TObject);
var
dt : tdataset;
begin
dbgrid1.DataSource.DataSet.Edit;
    dbgrid1.DataSource.DataSet.Post;      dt := DataSource2.DataSet;
    if (dt.FieldByName('STATUS').AsString  <> '') then
    begin
       if messagedlg('Are you sure to delete?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
        begin
            DataSource2.DataSet.Delete;                if DataSource2.DataSet is tadoquery then begin
                tadoquery(DataSource2.DataSet).UpdateBatch;
            end
        end
    end
    else
    begin
         showMessage('No record');
    end    end;
procedure TForm8.refresh(DataSet: TDataSet);
begin
      DataSet.Refresh;
     ADOTable1.Refresh;
end;    procedure TForm8.Button7Click(Sender: TObject);
begin          adoQuery1.Close;
      adoQuery1.SQL.Clear;         try
      adoQuery1.Open;
      finally
          adoQuery1.close;
          adoQuery1.free;
      end;    end;    procedure TForm8.FormCreate(Sender: TObject);    begin
        ShortDateFormat := dateFor;
      adoConnection1.Close;
      adoConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='   form5.mapPath   form5.dbname   ';Persist Security Info=False';
      try
          adoConnection1.Open;
      except
          showMessage('找不到資料');
          application.Terminate;
      end;            DBGrid1.DataSource.DataSet.Active := true;
       ADOTable1.Active:= true;
       setFilter;    end;    procedure TForm8.OnSelect(Sender: TObject);
var        sql : String;
    sqlVar : String;
    Status : String;    //status of the filter
    HName : String;    // Handler of the filter    begin
  // showMessage(comboBox2.text);
        if (comboBox2.itemIndex = 0) then
        begin
              adoQuery1.Close;
          adoQuery1.SQL.Clear;
          sql := 'Select * from joborder1';
            if (statuscombo.itemindex >0) then
          begin
               Status := statuscombo.text;                    if (statuscombo.ItemIndex = 1) then
                begin
                    sql := sql   ' where STATUS = ''OS'' or STATUS = ''WR''';
                end
                else
                begin
               sql := sql   ' where STATUS = '''   Status  ''' ';
               end;
               //showmessage(sqlVar);
          end;
          adoQuery1.SQL.Add(sql);
          adoQuery1.Open;
        end;            if (comboBox2.ItemIndex <> 0) then
        begin
          HName :=  comboBox2.Text;
          adoQuery1.Close;
          adoQuery1.SQL.Clear;
          sql := 'Select * from joborder1';
          sqlVar := 'where M_HANDLER = '''   HName   ''' ';                if (statuscombo.itemindex =1) then
            begin
                sqlVar := sqlVar   ' and (STATUS = ''OS'' or Status = ''WR'')';
            end;
          if (statuscombo.itemindex >1) then
          begin
               Status := statuscombo.text;
             //  showmessage(Status);
               sqlVar := sqlVar   ' and STATUS = '''   Status  ''' ';              end;
              //showmessage(sqlVar);
           adoQuery1.SQL.Add(sql);
          adoQuery1.SQL.add(sqlVar);
          adoQuery1.Open;
        end;
        orderby;
end;    procedure TForm8.Button8Click(Sender: TObject);
var
dt : tdataset;
begin
dbgrid1.DataSource.DataSet.Edit;
    dbgrid1.DataSource.DataSet.Post;      dt := DataSource2.DataSet;
    if (dt.FieldByName('STATUS').AsString  <> '') then      //    if (DBGrid1.SelectedField.AsString <> '') then
      begin
        form1.editPrepare;
      try
        Form1.ShowModal;
      except
         showMessage('can not add detail now');
      end
      end
      else
      begin
          showMessage('No record');
      end;
end;    procedure TForm8.Button1Click(Sender: TObject);
begin       if DBGrid1.DataSource.DataSet is TCustomADODataSet then
  with TCustomADODataSet(DBGrid1.DataSource.DataSet) do
  begin
        sort := 'EXPECTDATE'   ' DESC';
      Sort := 'M_Handler'   ' ASC';      end;    {
    adoQuery1.Close;
    adoQuery1.SQL.Add('order by M_handler');
    showmessage(sql);
try
    adoQuery1.Open;
except
end;
}
//showmessage(form5.mapPath);        rvproject1.Close;
rvproject1.ProjectFile :=  form5.mapPath    'Project1.rav';
rvproject1.Execute;
end;    procedure TForm8.setFilter;
begin       // reset the comboboxs          combobox2.Items.Clear;
      statusCombo.Items.Clear;
      // set the handler filter
        Combobox2.Text := 'Please select the handler';
       adoquery4.Active := false;
       adoquery4.SQL.Clear;
       adoquery4.SQL.Add('Select * from Staff;');
       adoquery4.Open;           comboBox2.items.Add('All Handler');
          while not adoQuery4.eof do
        begin
           combobox2.items.add(adoQuery4['StaffID']);
           adoQuery4.next;
        end;            // set the status filter
        statusCombo.text := 'status';
       adoquery4.Active := false;
       adoquery4.SQL.Clear;
       adoquery4.SQL.Add('Select * from Status;');
       adoquery4.Open;
       statuscombo.Items.add('All Status');
       statuscombo.items.add('OS/WR');
         while not adoQuery4.eof do
        begin
           statuscombo.items.add(adoQuery4['StatusID']);
           adoQuery4.next;
        end;              adoquery4.Active := false;             combobox2.ItemIndex :=0;
          statuscombo.ItemIndex := 1;
end;        procedure TForm8.ADOQuery1CalcFields(DataSet: TDataSet);
begin
with DataSource2.dataset do
begin
fieldbyname('Description').value:=fieldbyName('DESCRIPT1').value fieldbyName('DESCRIPT2').value;
end;    end;    procedure TForm8.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  pt: TGridcoord;
begin
  pt:= DBGrid1.MouseCoord(x, y);      if pt.y=0 then
    DBGrid1.Cursor:=crHandPoint
  else
    DBGrid1.Cursor:=crDefault;
end;    procedure TForm8.DBGrid1TitleClick(Column: TColumn);
{$J }
 const PreviousColumnIndex : integer = -1;
{$J-}
begin
  if DBGrid1.DataSource.DataSet is TCustomADODataSet then
  with TCustomADODataSet(DBGrid1.DataSource.DataSet) do
  begin
    try
      DBGrid1.Columns[PreviousColumnIndex].title.Font.Style :=
      DBGrid1.Columns[PreviousColumnIndex].title.Font.Style - [fsBold];
    except
    end;        Column.title.Font.Style :=
    Column.title.Font.Style   [fsBold];
    PreviousColumnIndex := Column.Index;        if (Pos(Column.Field.FieldName, Sort) = 1)
    and (Pos(' DESC', Sort)= 0) then
      Sort := Column.Field.FieldName   ' DESC'
    else
      Sort := Column.Field.FieldName   ' ASC';
  end;
end;
procedure TForm8.statusComboSelect(Sender: TObject);
var
    sql : String;
    sqlVar : String;
    Status : String;    //status of the filter
    HName : String;    // Handler of the filter
begin       //showMessage(statusCombo.text);
   if (statusCombo.itemIndex = 0) then
        begin
              adoQuery1.Close;
          adoQuery1.SQL.Clear;
          sql := 'Select * from joborder1 ';
            if (comboBox2.itemindex >0) then
          begin
              HName := comboBox2.text;
               sql := sql   ' where M_HANDLER = '''   HName  ''' ';
          end;
          adoQuery1.SQL.Add(sql);
          adoQuery1.Open;
        end;
        if (statusCombo.itemIndex = 1) then
        begin
              adoQuery1.Close;
          adoQuery1.SQL.Clear;
          sql := 'Select * from joborder1 where (Status = ''OS'' or Status = ''WR'')';
            if (comboBox2.itemindex >0) then
          begin
              HName := comboBox2.text;
             //  showmessage(Status);
               sql := sql   ' and M_HANDLER = '''   HName  ''' ';
               //showmessage(sqlVar);
          end;
          adoQuery1.SQL.Add(sql);
          adoQuery1.Open;
        end;
        if (statuscombo.ItemIndex > 1) then
        begin
          Status :=  statusCombo.Text;
          adoQuery1.Close;
          adoQuery1.SQL.Clear;
          sql := 'Select * from joborder1';
          sqlVar := 'where Status = '''   Status   ''' ';
          if (comboBox2.itemindex >0) then
          begin
              HName := comboBox2.text;
              sqlVar := sqlVar   ' and M_HANDLER = '''   HName  ''' ';
          end;
          //showmessage(sqlVar);
          adoQuery1.SQL.Add(sql);
          adoQuery1.SQL.add(sqlVar);
          adoQuery1.Open;
        end;
        orderby;
end;    procedure TForm8.precreate;
begin
        adoQuery1.Close;
        adoQuery1.SQL.Clear;
        adoQuery1.SQL.add('select * from joborder1 where STATUS = ''OS'' or STATUS = ''WR''');
        adoQuery1.Open;
        DBGrid1.DataSource.DataSet.Active := true;
       ADOTable1.Active:= true;
       setFilter;
       orderby();
end;
procedure TForm8.Button3Click(Sender: TObject);
begin
    dbgrid1.DataSource.DataSet.Edit;
    dbgrid1.DataSource.DataSet.Post;            OnSelect(Sender);
end;
procedure TForm8.BitBtn1Click(Sender: TObject);
begin
    dbgrid1.DataSource.DataSet.Edit;
    dbgrid1.DataSource.DataSet.Post;        Form1.addPrepare;
      try
        Form1.ShowModal;
      finally
      end;
end;
procedure FixDBGridColumnsWidth(const DBGrid: TDBGrid);
var
  i : integer;
  TotWidth : integer;
  VarWidth : integer;
  ResizableColumnCount : integer;
  AColumn : TColumn;
begin
  //total width of all columns before resize
  TotWidth := 0;
  //how to divide any extra space in the grid
  VarWidth := 0;
  //how many columns need to be auto-resized
  ResizableColumnCount := 0;      for i := 0 to -1   DBGrid.Columns.Count do
  begin
    TotWidth := TotWidth   DBGrid.Columns[i].Width;
    if DBGrid.Columns[i].Field.Tag <> 0 then 
      Inc(ResizableColumnCount);
  end;      //add 1px for the column separator line
  if dgColLines in DBGrid.Options then
    TotWidth := TotWidth   DBGrid.Columns.Count;      //add indicator column width
  if dgIndicator in DBGrid.Options then
    TotWidth := TotWidth   IndicatorWidth;      //width vale "left"
  VarWidth :=  DBGrid.ClientWidth - TotWidth;      //Equally distribute VarWidth
  //to all auto-resizable columns
  if ResizableColumnCount > 0 then
    VarWidth := varWidth div ResizableColumnCount;      for i := 0 to -1   DBGrid.Columns.Count do
  begin
    AColumn := DBGrid.Columns[i];
    if AColumn.Field.Tag <> 0 then
    begin
      AColumn.Width := AColumn.Width   VarWidth;
      if AColumn.Width < AColumn.Field.Tag then
        AColumn.Width := AColumn.Field.Tag;
    end;
  end;
end; (*FixDBGridColumnsWidth*)        procedure TForm8.FormResize(Sender: TObject);
begin
//FixDBGridColumnsWidth(DBGrid1);    end;    procedure TForm8.DBGrid1DblClick(Sender: TObject);
begin
     Button8Click(Sender);
end;    procedure TForm8.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (key = VK_F11) then
    Button8Click(self);
  if (key = VK_F10) then
     BitBtn1Click(self);
  if (key = VK_ESCAPE ) then
      Button2Click(sender);      //if (Shift = [ssCtrl]) and (key = VK_Delete) then
     // Button4Click(sender);      if (key = VK_F12) then
  begin
    dbgrid1.DataSource.DataSet.Edit;
    dbgrid1.DataSource.DataSet.Post;
  end;
  if (key = VK_F1) then
  begin      end;    end;    procedure TForm8.orderby;
begin
    if DBGrid1.DataSource.DataSet is TCustomADODataSet then
  with TCustomADODataSet(DBGrid1.DataSource.DataSet) do
  begin
        sort := 'EXPECTDATE'   ' DESC';
  end;
end;
procedure TForm8.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Button2Click(self);
end;    end.
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-06 13:32:53 IP:203.69.xxx.xxx 未訂閱
正在看你的程式, 不過可否請您以後貼程式的時候 將程式貼在    [code]   你的程式 [/code]    這樣縮排就會顯示出來, 讀的人解答的意願也會提高.... 發表人 -
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-06 22:11:27 IP:61.219.xxx.xxx 未訂閱
procedure TForm8.setFilter;
begin
  Exit;
  // reset the comboboxs
.....    procedure TForm8.orderby;
begin
  Exit;
  if DBGrid1.DataSource.DataSet is TCustomADODataSet then
    with TCustomADODataSet(DBGrid1.DataSource.DataSet) do
    begin
      sort := 'EXPECTDATE'   ' DESC';
    end;
end;
看不出來有明顯問題, 把紅色部分加上去, 會比較快嗎.... RvProject1: TRvProject; RvSystem1: TRvSystem; RvDataSetConnection1: TRvDataSetConnection; 你程式碼是完整的嗎? 這幾個元件有用到嗎?
系統時間:2024-05-19 16:11:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!