2021年12月15日 星期三

Flutter 簡易起手式

起始專案

import 'package:flutter/material.dart';

void main() {
runApp(
MyApp());
}

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home:
Scaffold(
body:
_mainbody(),
),
);
}
}

class _mainbody extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child:
RaisedButton(
child:
Text("Hello Button"),
onPressed: () {
// ...do something...
// ...
// ...go to page2...
//Navigator.push(context,
// MaterialPageRoute<void>(builder:(BuildContext context) {
// return page2() ;
//})

},
      ),
);
}
}


 StatelessWidget

import 'package:flutter/material.dart';

class page2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: _page2()
);
}
}

class _page2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body:Center(
child: RaisedButton(
child: Text("Home"),
onPressed: () {
// ...do someting...
// ...
// ...return homepage...
//Navigator.pop(context);
}),
),
);
}
}



Flutter TabBar 頁籤導航元件

 

TabBar


import 'package:flutter/material.dart';
import 'package:untitled/Page2.dart'; //TabBar 引入頁面
import 'package:untitled/Page3.dart'; //TabBar 引入頁面
import 'package:untitled/Constants.dart'; //常數

class page1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Scaffold(
body: _page1(),
),
);
}
}

class _page1 extends StatelessWidget {
final List<Tab> myTabs = <Tab>[
Tab(text: 'Tab1'),
Tab(text: 'Tab2'),
];

final pages = [page2(), page3()];

@override
Widget build(BuildContext context) {
return MaterialApp(
home: DefaultTabController(
length: myTabs.length,
child: Scaffold(
appBar: AppBar(
backgroundColor: appDarkGreyColor,
title: Text("title"),
bottom: TabBar(
tabs: myTabs,
),
),
body: TabBarView(
children: <Widget>[page2(), page3()],
),
),
),
);
}
}




2021年12月11日 星期六

Flutter Container 設定佔滿畫面寬度

Container(
  width: MediaQuery.of(context).size.width,
  child: Text("畫面寬度"),
)

Flutter Password input type

TextFormField(
      ...
      obscureText: true,
      enableSuggestions: false,
      autocorrect: false,
      ...
)


Flutter Material Components widgets

 

Material Components widgets

Flutter 圖像引用

 

自行建立專案目錄 assets\images,將圖像用複製/貼上的方式將文件置入。


開啟pubspec.yami,將 - assets/images/Icon-192.png 放置在文件中 flutter: 範圍內。


就可以被程式載入引用




2021年12月9日 星期四

Flutter 安裝設置


Flutter中文網,有完整的安裝說明及開發教學
https://flutterchina.club
 

【下載Flutter SDK】

首先到Fluter官網下載 Flutter SDK,是一個Zip壓縮文件,網頁中提到不要將解壓後的文件夾放置在含有高權限的特定目錄裡

【設置系統環境變數】




參考 Windows不重啟就使環境變數修改生效.  套用系統環境參數

【安裝 Android Studio】

https://developer.android.com/studio

【設置Flutter】

命令提示字元中輸入 \flutter\bin> flutter doctor 做環境檢測


執行 \flutter\bin> flutter doctor --android-licenses ,同意Android服務條款


【Android Studio 安裝 Flutter Plugin / Flutter】

Flutter Plugin

Flutter

【設置 Chrome 模擬器】

命令提示字元中依序執行

    \flutter\bin> flutter channel beta

    \flutter\bin> flutter upgrade

    \flutter\bin> flutter config --enable-web


2021年12月8日 星期三

【Delphi Multi-Device Application】 拍照與分享

 畫面貼上
  TSpeedButton (拍照)
  TSpeedButton (分享)
  TActionList
  TImage (圖像)


【拍照】

ActionList -> New Standard Action ... -> TTablePhotoFromCameraAction

TablePhotoFromCameraAction -> OnDidFinishTaking 事件,將圖像填入Image1
Code: Image1.Assign(Image);

SpeedButton1.Action 指向 ActionList1.TaskPhotoFromCameraAction1做連動


分享

ActionList -> New Standard Action ... -> TShowShareSheetAction

ShareSheetAction1 -> OnDidFinishTaking 事件
Code: ShowShareSheetAction1.Bitmap.Assign(Image1.Bitmap);


SpeedButton2.Action 指向 ActionList1.ShowShareSheetAction1做連動


參考:https://www.shuzhiduo.com/A/ZOJPkygPzv/



2021年12月5日 星期日

【Delphi Multi-Device Application】 MultiView 側邊功能選單

 




MultiView.MasterButton 指定主功能鈕
MultiView.Mode 設定模式

參考:
Delphi LiveCode #08 - Criando um menu Estilo Window 10 com Delphi/Firemonkey

影片中 SpeedButton 在 MultiView 裡一併顯示圖示與文字,是StyleBook套用後呈現的效果。







2021年10月27日 星期三

Delphi Record Helper , Class 功能擴充

 Record Helper

Ex :

type
  TComboBoxHelper = class helper for TComboBox
  public
    procedure LoadStrings(const AStrings: TStrings); // 載入資料
    function SelectedValue: string;                  // 取得選取文字
    procedure SelectValue(const AValue: string);     // 設定選取文字
    procedure ClearAndLoad(const AStrings: array of string); // 快速清空並載入
  end;


Ex:

type
  TIntegerHelper = record helper for Integer
  public
    function ToString: string;
  end;

function TIntegerHelper.ToString:String;
begin
  Result := IntToStr(Self);
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:Integer;
begin
  showmessage(a.ToString());
end;

有國外網友將DateTime Class擴充功能,利於方便操作



2021年9月12日 星期日

Try..Except..End 例外狀況處理

Try
  ...
  ...
Except
  ...
End;


Exception

Try
  ...
  ...
Except
   on E:Exception do
  begin
    MessageBox(Handle, PWideChar(E.Message), PWideChar(E.ClassName), MB_ICONError);
  end
End;

2021年9月2日 星期四

Delphi DataSet和JSON互轉函式

 一、DataSet轉JSON

//1)資料集轉換為JSON字串:
//需USES System.JSON;
function DataSetToJson(ADataset: TDataSet): string;
var
  LRecord: string;
  LField: TField;
  i: integer;
begin
  Result := '';
  if (not ADataset.Active) or (ADataset.IsEmpty) then
    Exit;
  Result := '[';
  ADataset.DisableControls;
  ADataset.First;
  while not ADataset.Eof do
  begin
    for i := 0 to ADataset.FieldCount - 1 do
    begin
      LField := ADataset.Fields[i];
      if LRecord = '' then
        LRecord := '{"' + LField.FieldName + '":"' + LField.Text + '"'
      else
        LRecord := LRecord + ',"' + LField.FieldName + '":"' + LField.Text + '"';
      if i = ADataset.FieldCount - 1 then
      begin
        LRecord := LRecord + '}';
        if Result = '[' then
          Result := Result + LRecord
        else
          Result := Result + ',' + LRecord;
        LRecord := '';
      end;
    end;
    ADataset.Next;
  end;
  ADataset.EnableControls;
  Result := Result + ']';
end;

二、JSON轉DataSet

//2)JSON字串轉換為資料集:
procedure JsonToDataSet(AJson: string; ADataset: TDataSet);
var
  jDataSet: TJSONArray;
  jRecord: TJSONObject;
  i, j: Integer;
begin
  if (AJson = '') or (ADataset = nil) or (not ADataset.Active) then
    Exit;
  jDataSet := TJSONArray.Create;
  jDataSet := TJSONObject.ParseJSONValue(AJson, True) as TJSONArray;
  while not ADataset.Eof do
    ADataset.Delete;
  for i := 0 to jDataSet.Size - 1 do
  begin
    ADataset.Append;
    jRecord := jDataSet.Get(i) as TJSONObject;
    for j := 0 to ADataset.FieldCount - 1 do
    begin
      if ADataset.Fields[j].ReadOnly then
        Continue;
      ADataset.Fields[j].AsString := jRecord.GetValue(ADataset.Fields[j].FieldName).Value;
    end;
    ADataset.Post;
  end;
end;

轉貼至: https://www.itread01.com/content/1548927014.html,(因應語法及版本做適當的修正)


Json To ClientDataset

procedure JsonToClientDataset(AJson:String; AClientDataset:TClientDataset);
var
  jDataSet: TJSONArray;
  jRecord: TJSONObject;
  i, j: Integer;
  procedure CreateClientDataset;
  var k, iFieldCount:Integer;
    sFieldName:String;
  begin
    AClientDataset.Close;
    AClientDataset.Fields.Clear;
    AClientDataset.FieldDefs.Clear;
    jRecord := jDataSet.Get(0) as TJSONObject;
    iFieldCount := jRecord.Count; //欄位數
    for k := 0 to iFieldCount-1 do
    begin
      sFieldName := Trim(jRecord.Pairs[k].JsonString.Value);
      AClientDataset.FieldDefs.Add(sFieldName, ftString, 2000);
    end;
    AClientDataset.CreateDataSet;
  end;
begin
  if (AJson = '') or (AClientDataset = nil) then
    Exit;
  jDataSet := TJSONArray.Create;
  jDataSet := TJSONObject.ParseJSONValue(AJson, True) as TJSONArray;
  //
  CreateClientDataset;
  //
  for i := 0 to jDataSet.Size - 1 do
  begin
    AClientDataset.Append;
    jRecord := jDataSet.Get(i) as TJSONObject;
    for j := 0 to AClientDataset.FieldCount - 1 do
    begin
      AClientDataset.Fields[j].AsString := jRecord.GetValue(AClientDataset.Fields[j].FieldName).Value;
      jDataSet.Count;
    end;
    AClientDataset.Post;
  end;
end;

2021年9月1日 星期三

截取 ADO 錯誤訊息

 procedure ADOConnection1ExecuteComplete(Connection: TADOConnection; RecordsAffected: Integer;
  const Error: Error; var EventStatus: TEventStatus; const Command: _Command; const Recordset: _Recordset);
begin
  //ADO 錯誤訊息
  if EventStatus=esErrorsOccured then
  begin
    ShowMessage(Error.Description);
  end;
end;

組件資源引用

uses  AdoConEd;
if  AdoConEd.EditConnectionString(AdoConnection) then  ...




Path:
    C:\Program Files (x86)\Embarcadero\Studio\17.0\source\Property Editors

uses SQLEdit;






2021年8月27日 星期五

[^] (萬用字元 - 不相符的字元) (Transact-SQL)

 

[^] (萬用字元 - 不相符的字元) (Transact-SQL)


比對不在方括弧 [^] 之間指定範圍或集合內的任何單一字元。 這些萬用字元可用於包含模式比對 (如 LIKE 和 PATINDEX) 的字串比較中。

範例

簡單範例

下列範例會使用 [^] 運算子來尋找 Contact 資料表中前 5 個名字開頭都是 Al 且名字第三個字母不是 a 的人員。

-- Uses AdventureWorks SELECT TOP 5 FirstName, LastName FROM Person.Person WHERE FirstName LIKE 'Al[^a]%';

以下為結果集。

FirstName LastName --------- -------- Alex Adams Alexandra Adams Allison Adams Alisha Alan Alexandra Alexander

搜尋字元範圍

萬用字元集合可以包含單一字元或字元範圍,以及字元和範圍的組合。 下列範例會使用 [^] 運算子來尋找開頭並非字母或數字的字串。

SELECT [object_id], OBJECT_NAME(object_id) AS [object_name], name, column_id FROM sys.columns WHERE name LIKE '[^0-9A-z]%';

以下為結果集。

object_id object_name name column_id --------- ----------- ---- --------- 1591676718 JunkTable _xyz 1


轉貼至: https://docs.microsoft.com/zh-tw/sql/t-sql/language-elements/wildcard-character-s-not-to-match-transact-sql?view=sql-server-ver15

2021年8月26日 星期四

[] (萬用字元-字元 (s) 以符合) (transact-sql)

 符合方括號 [ ] 之間所指定之指定範圍或集合內的任何單一字元。 這些萬用字元可用於包含模式比對 (如 LIKE  PATINDEX) 的字串比較中。

範例

簡單範例

下列範例會傳回開頭為字母 m 的名稱。 [n-z] 會指定第二個字母必須是範圍從 n 到 z 中的某一個字母。 百分比萬用字元 % 允許開頭為字元 3 的任何字元或沒有字元。 model 和 msdb 資料庫符合此原則。 master 資料庫不符合準則,並會從結果集中加以排除。


SELECT name FROM sys.databases WHERE name LIKE 'm[n-z]%';

以下為結果集。

name ----- model msdb


使用結合範圍和單一字元的集合

萬用字元集合可同時包含單一字元和範圍。 下列範例會使用 [] 運算子來尋找開頭為數字或一系列特殊字元的字串。

SELECT [object_id], OBJECT_NAME(object_id) AS [object_name], name, column_id FROM sys.columns WHERE name LIKE '[0-9!@#$.,;_]%';

以下為結果集。

object_id object_name name column_id --------- ----------- ---- --------- 615673241 vSalesPersonSalesByFiscalYears 2002 5 615673241 vSalesPersonSalesByFiscalYears 2003 6 615673241 vSalesPersonSalesByFiscalYears 2004 7 1591676718 JunkTable _xyz 1


轉貼至: https://docs.microsoft.com/zh-tw/sql/t-sql/language-elements/wildcard-character-s-to-match-transact-sql?view=sql-server-ver15


2021年8月9日 星期一

須臾

 

須臾

維基百科,自由的百科全書

須臾,指很短的時間。早見於《荀子・勸學篇第一》:「吾嘗終日而思,不如須臾之所學也。」(我整天思考,也不及片刻學習的得著。)

漢字翻譯佛教經典時,則把時間單位 muhūrta 譯作須臾。根據佛教《僧祇律》中記載:「剎那者為一念, 二十念為一瞬, 二十瞬為一彈指,二十彈指為一羅預, 二十羅預為一須臾, 一日一夜為三十須臾。」所以一須臾等於0.8小時,換算為48分鐘或2880秒。

後來,又有某些書籍將其混入詞頭中,用來表達10^{{-15}},但現在更常使用「飛」或「飛母托」(相當於歐文的前輟 femto-),如 femtosecond 一般譯作「飛秒」。

轉貼自: https://zh.wikipedia.org/wiki/%E9%A0%88%E8%87%BE