DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: fffff111
今日帖子: 28
在线用户: 13
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 coater (coater) ▲▲▲▲▲ -
注册会员
2019/4/28 20:43:10
标题:
菜鸟请教一个问题 浏览:319
加入我的收藏
楼主: 我在Uni1中创建一个全局变量 variant
在unit2中如果在 

TMyExtension = class
    class procedure mser(const data: string);


中引用这个变量,无论unii1中variant如何改变值,class procedure mser中variant永远都是初始值。
------难道class在软件初始化后复制了初始值,然后就引用该复制值?
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/4/29 9:00:46
1楼: 好歹多贴点相关代码啊?就这么一两行,谁能猜到原因?
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 coater (coater) ▲▲▲▲▲ -
注册会员
2019/4/29 15:27:28
2楼: unit unit2


interface

uses
...
type
  TMyExtension = class
    class procedure mser(const data: string);
    class procedure sendser(const msgtext, msgname : string);
    class function StringNameToVariant(const AStringName : string): string;
  end;
implementation

uses unit1;

class function TMyExtension.StringNameToVariant(const AStringName : string): string;

  Result:=variant;
  showmessage(variant);
end;

----------
 无论unit1中variant如何改变,这里的showmessage(variant);显示的始终是其初始值。
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/4/29 15:31:18
3楼: 你这个variant是全局变量?没看到定义啊!只看到使用。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲▲ -
普通会员
2019/4/29 15:33:07
4楼: 继续挤牙膏。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 coater (coater) ▲▲▲▲▲ -
注册会员
2019/4/30 9:47:27
5楼: unit unit1

interface

uses
...
var myvariant:string;
...
Form1.Button1Click(Sender: TObject);
begin
myvariant='a123';
end;
----------
unit unit2


interface

uses
...
type
  TMyExtension = class
    class procedure mser(const data: string);
    class procedure sendser(const msgtext, msgname : string);
    class function StringNameToVariant(const AStringName : string): string;
  end;
implementation

uses unit1;

class function TMyExtension.StringNameToVariant(const AStringName : string): string;

  Result:=myvariant;
  showmessage(myvariant);
end;

----------
 无论unit1中myvariant如何改变,unit2的class function 里面showmessage(myvariant);显示的始终是其初始值。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲▲ -
普通会员
2019/4/30 10:09:16
6楼: 显示 a123 应该是对的吧。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 coater (coater) ▲▲▲▲▲ -
注册会员
2019/4/30 10:15:45
7楼: 不显示  a123 
而是显示空白值。

--------如果在unit1中
var myvariant:string = 'stran';
再Button1Click ;

unit2的class function 里面showmessage(myvariant);显示的始终是 stran
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/4/30 11:01:35
8楼: 你确定你执行TMyExtension.StringNameToVariant时是在修改myvariant值之后?
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 coater (coater) ▲▲▲▲▲ -
注册会员
2019/5/5 14:43:56
9楼: 我十分肯定啊,设置两个按纽,一个改变myvariant值一个执行StringNameToVariant,先点击前一个再点击后一个。
----------------------------------------------
-
作者:
男 hdcopy (hdcopy) ▲▲▲▲▲ -
普通会员
2019/5/5 14:55:57
10楼: 在工程中搜索myvariant,我预计你是在unit2的某处也定义了个它了。
----------------------------------------------
-
作者:
男 coater (coater) ▲▲▲▲▲ -
注册会员
2019/5/6 16:10:54
11楼:  贴上所有代码:(cef4)
unit Unit1;

interface

uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.ComCtrls,Generics.Collections,
  System.StrUtils, Masks,

  uCEFWindowParent, uCEFChromium, uCEFConstants, uCEFApplication, uCEFInterfaces,
   uCEFTypes, uCEFProcessMessage, uCEFMiscFunctions, uCEFSchemeRegistrar, uCEFRenderProcessHandler,
  uCEFv8Handler, uCEFDomVisitor, uCEFDomNode, uCEFTask;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    CEFWindowParent1: TCEFWindowParent;
    Chromium1: TChromium;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  myvariant:string;
  procedure CreateGlobalCEFApp;  //initialize
implementation
    uses unit2, uCEFStringMultimap,  DateUtils;   // TCefStringMultimapOwn : uCEFStringMultimap
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  myvariant:='Unita1';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   //
   Chromium1.Browser.MainFrame.ExecuteJavaScript('TMyExtension.StringNameToVariant("1")', Chromium1.browser.MainFrame.GetURL (), 0 );
end;

procedure GlobalCEFApp_OnWebKitInitialized;
begin

  // Registering the extension. Read this document for more details :
  // https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration.md
  TCefRTTIExtension.Register('MyJavaExtension', TMyExtension);
end;

procedure CreateGlobalCEFApp;  //use , uCEFApplication
begin

  GlobalCEFApp          := TCefApplication.Create;
  GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitialized;

end;


end.
----------

unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
type
  TMyExtension = class
    class function StringNameToVariant(const AStringName : string): string;
  end;

implementation
 uses unit1;
 class function TMyExtension.StringNameToVariant(const AStringName : string): string;
  begin
  Result:=myvariant;
  showmessage(myvariant);
  end;
end.
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲▲ -
普通会员
2019/5/7 9:34:50
12楼: unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  myvariant:string;

implementation

{$R *.dfm}


uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
  myvariant:='Unita1';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 TMyExtension.StringNameToVariant('');
end;

end.



毫无问题。
楼主骗子。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/5/7 10:12:07
13楼: 有可能是楼主是在浏览器中调用JS导致的问题,估计是JS调用时不能简单地用全局变量吧。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲▲ -
普通会员
2019/5/7 10:55:11
14楼: 想想内存模型。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 coater (coater) ▲▲▲▲▲ -
注册会员
2019/5/7 15:21:44
15楼: @wang_80919  方便具体指点下不,谢谢啦。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲▲ -
普通会员
2019/5/7 15:37:28
16楼: 代码已经发了。其他的我也不懂。
----------------------------------------------
(C)(P)Flying Wang
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行39.0625毫秒 RSS