全力わはー RSSフィード

2016-11-26

Component Tray

01:35 | Component Trayを含むブックマーク

f:id:tales:20161126012453g:image

これは何?

DelphiのIDEにコンポーネント置き場を追加するプラグインです。非ビジュアルコンポーネントを別の場所へ隔離できるので、デザイン時にこれらのアイコンが邪魔になりません。

動作環境

10.1 Berlinでしかテストしてないので他の環境で動くかどうかは分かりませんが、想定上の最低動作バージョンは10 Seattleです。XE8以前では必要な機能が無いので動きません。

注意点など

このプラグインをインストールするとフォームデザイナ上の非ビジュアルコンポーネントは設定にかかわらず完全に非表示になります。例外はTDataModuleのデザイン時のみです。

ダウンロード

https://github.com/lynatan/ComponentTray

2016-10-22

DLight 0.0.2

00:43 | DLight 0.0.2を含むブックマーク

DLightとは

f:id:tales:20161022003831p:image

更新点

10 Seattleの対応と、10.1 Berlin Starter Editionの限定的対応(監視式内容の表示のみ)の追加。

あと今回からGitHubに上げて、Delphinusからもインストールできるようにしました。

ダウンロード

https://github.com/lynatan/DLight

2016-10-15

インライン評価プラグイン「DLight」を作った

02:34 | インライン評価プラグイン「DLight」を作ったを含むブックマーク

DLightって何?

Light TableのInline Evaluationのように、デバッグ実行時にローカル変数と監視式の値をインライン表示するプラグインです。

たぶん説明するより見た方が早い。

http://i.imgur.com/WhYTpAH.gif

ダウンロード

DLight 0.0.1をダウンロード

現在はDelphi 10.1 Berlin専用です。が、特に理由があるわけでは無く単純に手抜きなので、数バージョン程度遡って対応する可能性はあります。

Starterで動くかどうかは試してないので人柱求む。

今後の予定

安定して動いているようならGitHubに上げて、あとはスーパーハカー的な人による改良を寝て待ちたいと思います。現状では簡単な構文解析もせず単純な文字列比較だけで変数を扱ってる都合上、スペースひとつ入っているだけで表示されなかったりする始末なので。まともに動かすならDelphiASTみたいなライブラリを使って構造を把握してやる必要があると思います。とりあえず動くものをさっさと出したかったのでソースがとんでもなく汚いですが、その辺は気合いでよろしくお願いします(丸投げ)。

2016-10-09

macOSでDockメニューに独自項目を追加する。

| 01:00 | macOSでDockメニューに独自項目を追加する。を含むブックマーク

サンプルコード

uses
  ...,
  System.Messaging,
  Macapi.ObjCRuntime, Macapi.ObjectiveC, Macapi.AppKit, Macapi.Helpers,
  FMX.Helpers.Mac;

procedure TForm1.FormCreate(Sender: TObject);
begin
  TMessageManager.DefaultManager.SubscribeToMessage(TApplicationDockMenuMessage,
    procedure(const Sender: TObject; const M: TMessageBase)
    var
      menu: NSMenu;
      item: NSMenuItem;
    begin
      menu := TNSMenu.Create;
      TNSAutoreleasePool.OCClass.addObject((menu as ILocalObject).GetObjectID);

      item := menu.addItemWithTitle(StrToNSStr('AAA'), sel_getUid('onMenuClicked:'), StrToNSStr(''));
      item.setTag(1);
      item := menu.addItemWithTitle(StrToNSStr('BBB'), sel_getUid('onMenuClicked:'), StrToNSStr(''));
      item.setTag(2);

      TApplicationDockMenuMessage(M).Value.ReturnValue := menu;
    end);

  TMessageManager.DefaultManager.SubscribeToMessage(TApplicationMenuClickedMessage,
    procedure(const Sender: TObject; const M: TMessageBase)
    var
      item: NSMenuItem;
    begin
      item := TApplicationMenuClickedMessage(M).Value.Sender as NSMenuItem;
      case item.tag of
        1: ... // AAA
        2: ... // BBB
      end;
    end);
end;

f:id:tales:20161009005910p:image

2016-09-13

class or class = ???

| 01:01 | class or class = ???を含むブックマーク

1200万パワーだ!

昨日の記事の応用編。なんと演算子オーバーロードの代替表記を使えば、通常では組み合わせることのできない演算子オーバーロードとジェネリクスを同時に使えます。

サンプルコード

https://gist.github.com/lynatan/673e574faa8343fa01d7a91e75065c54

type
  TObjectHelper = class helper for TObject
  public
    class function &&op_LogicalOr<T: class>(A, B: T): T; static;
  end;

class function TObjectHelper.&&op_LogicalOr<T>(A, B: T): T;
begin
  if A <> nil then
    Result := A
  else
    Result := B;
end;

procedure Test;
var
  sl1, sl2, sl3: TStringList;
begin
  sl1 := nil;
  sl2 := TStringList.Create;
  sl3 := sl1 or sl2; // -> sl3 = sl2
end;