Thursday, May 26, 2016

[X.Andriod] ImageView

查到這篇官網文章 Display An Image,文章就是把 drawable 內圖片顯示到 ImageView 上,稍微做點變化來練習 - 隨機顯示 drawable 內圖片

drawable 內放進三張圖片
[X.Andriod] ImageView-2

Main.axml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:id="@+id/myButton"
        android:layout_width="fill_parent"
        android:layout_height="50.0dp"
        android:text="@string/changeImage" />
    <ImageView
        android:src="@drawable/sample1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/DemoImageView"
        android:scaleType="fitCenter" />
</LinearLayout>
[X.Andriod] ImageView-1

MainActivity.cs
using System.Reflection;

namespace ImageViewBase
{
    [Activity(Label = "ImageView 基礎練習", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            SetContentView(Resource.Layout.Main);

            Button btn = FindViewById<Button>(Resource.Id.myButton);
            btn.Click += (sender, e) =>
            {

                var image = FindViewById<ImageView>(Resource.Id.DemoImageView);

                // 產生隨機整數
                Random r = new Random(Guid.NewGuid().GetHashCode());
                int IndexID = r.Next(0, typeof(Resource.Drawable).GetFields().Length);

                // 從 Drawable 內的圖片抓出來
                FieldInfo[] infos = typeof(Resource.Drawable).GetFields();

                //取得 Drawable 圖片名稱
                string FileName = infos[IndexID].Name.ToLower();

                // 取得 ResourceID
                int RecID = Resources.GetIdentifier(
                            FileName, 
                            "drawable", 
                            "ImageViewBase.ImageViewBase");

                // 利用 ResourceID 顯示圖片
                image.SetImageResource(RecID);
            };
        }
    }
}
[X.Andriod] ImageView-3

Tuesday, May 24, 2016

[C#] EventLog

根據這篇 逐步解說:探索事件記錄檔、事件來源和項目 改寫的簡易範例,幫助自已了解 EventLog 相關使用
  • WinForm Layout
[C#] EventLog-1
  • Code
using System.Diagnostics;

namespace WalkthroughEventLog
{
  public partial class Form1 : Form
  {
      public Form1()
      {
          InitializeComponent();
      }

      EventLog eventlog = new EventLog();
      ErrorProvider errorSource = new ErrorProvider();
      ErrorProvider errorLog = new ErrorProvider();

      private void Form1_Load(object sender, EventArgs e)
      {
          dgvEntry.AutoGenerateColumns = false;

          cboEventLogEntryTypeSource();
          ControlDefaultValue();

          txtSourceName.Validated += Text_Validated;
          txtLogName.Validated += Text_Validated;

          ExistsCheck();
          EventLogSetting();
          ReadEventLogEntry();
      }

      private void Text_Validated(object sender, EventArgs e)
      {
          ExistsCheck();
          EventLogSetting();
      }

      /// 
      /// 設定 cboEventLogEntryType 資料來源
      /// 
      private void cboEventLogEntryTypeSource()
      {
          cboEventLogEntryType.Items.Add(EventLogEntryType.Error);
          cboEventLogEntryType.Items.Add(EventLogEntryType.FailureAudit);
          cboEventLogEntryType.Items.Add(EventLogEntryType.Information);
          cboEventLogEntryType.Items.Add(EventLogEntryType.SuccessAudit);
          cboEventLogEntryType.Items.Add(EventLogEntryType.Warning);
      }

      /// 
      /// 設定控件初始值
      /// 
      private void ControlDefaultValue()
      {
          txtSourceName.Text = "Source1";
          txtLogName.Text = "NewLog1";
          cboEventLogEntryType.SelectedItem = EventLogEntryType.Information;
          txtMessage.Text = "EventLog 小範例練習";
      }

      /// 
      /// 設定 EventLog.Source 和 EventLog.Log
      /// 
      private void EventLogSetting()
      {
          // Source 是指 Regedit 內的機碼
          eventlog.Source = txtSourceName.Text;
          // 應用程式及服務紀錄檔內會產生一個 Log
          eventlog.Log = txtLogName.Text; 
      }
 
      /// 
      /// 判斷 EventLog 的 Source 是否存在
      /// 
      /// true 或 false
      private bool SourceExists()
      {
          return EventLog.SourceExists(txtSourceName.Text); ;
      }

      /// 
      /// 判斷 EventLog 的 Log 是否存在
      /// 
      /// true 或 false
      private bool LogExists()
      {
          return EventLog.Exists(txtLogName.Text);
      }

      /// 
      /// 判斷 EventLog Source 和 Log 是否存在,不存在必須透過 ErrorProvider 提出警告
      /// 
      private void ExistsCheck()
      {
          errorSource.Clear();
          errorLog.Clear();

          if (SourceExists() == false)
              errorSource.SetError(
                  txtSourceName,
                  $"{txtSourceName.Text} 不存在");

          if (LogExists() == false)
              errorLog.SetError(
                  txtLogName,
                  $"{txtLogName.Text} 不存在");
      }

      private void btnCreateLog_Click(object sender, EventArgs e)
      {
          if (SourceExists())
              EventLog.DeleteEventSource(txtSourceName.Text);

          EventLog.CreateEventSource(txtSourceName.Text, txtLogName.Text);

          ExistsCheck();
          ReadEventLogEntry();
      }

      private void btnRemoveSource_Click(object sender, EventArgs e)
      {
          if (SourceExists())
              EventLog.DeleteEventSource(txtSourceName.Text);

          ExistsCheck();
          ReadEventLogEntry();
      }

      private void btnDeleteLog_Click(object sender, EventArgs e)
      {
          // 刪除 Log 檔案,會一併連 Source 一起刪除喔
          if (LogExists())
              EventLog.Delete(txtLogName.Text);

          ExistsCheck();
          ReadEventLogEntry();
      }

      private void btnWriteEntry_Click(object sender, EventArgs e)
      {
          if (LogExists() == false) return;

          eventlog.WriteEntry(
              txtMessage.Text,
              (EventLogEntryType)cboEventLogEntryType.SelectedItem);

          ReadEventLogEntry();
      }

      private void btnClearLog_Click(object sender, EventArgs e)
      {
          if (LogExists() == false) return;

          // 清除 Log 裡面的紀錄
          eventlog.Clear();
          ReadEventLogEntry();
      }

      /// 
      /// 讀取 EventLog Log 內的事件資料並顯示在 DataGridView 上
      /// 
      private void ReadEventLogEntry()
      {
          dgvEntry.DataSource = null;

          if (LogExists() == false)
          {
              lblLogGuide.Text = $"{txtLogName.Text} 不存在,無法進行讀取";
              return;
          }

          lblLogGuide.Text = $"{txtLogName.Text} 內,有 {eventlog.Entries.Count} 筆資料";

          // 把資料丟進 DataGridView 內來顯示
          List<EventLogInfo> result = new List<EventLogInfo>();

          foreach (EventLogEntry entry in eventlog.Entries)
          {
              EventLogInfo data = new EventLogInfo()
              {
                  eventLogEnterType = entry.EntryType,
                  message = entry.Message,
                  timeWritten = entry.TimeWritten,
                  source = entry.Source
              };

              result.Add(data);
          };
   
          dgvEntry.DataSource = result;
      }
  }

  public class EventLogInfo
  {
      public EventLogEntryType eventLogEnterType { get; set; }
      public string message { get; set; }
      public DateTime timeWritten { get; set; }
      public string source { get; set; }
  }
}

Monday, May 23, 2016

[Win] 刪除連接埠內印表機

在 Win10 上設定 LQ-680C 時,該 PC 上有多個 LPT 介面,測了一下印表機到底是連接哪一個,結果沒想到確定後把印表機刪除後,連接埠內仍然有設定殘留,即使重開機也還是在,導致再安裝時,必須取別的名稱,Orz

忘記截問題圖,這是在某張截圖的背景抓出來的,可以看出 LTP2 內還有 Epson LQ-680C
LTP1 是正確的連接介面,只好先加個 2 在名稱後面,先讓使用者可以正常列印

[Win] 刪除連接埠內印表機-1

GUI 介面內,要直接刪除該連接埠,也被防呆擋下來,最後只好進 regedit 內直接刪除該印表機機碼,機碼路徑為HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print\Prints\Epson LQ-680C

[Win] 刪除連接埠內印表機-2

刪除後 LPT2 內的印表機,就不會有 LQ-680C 存在

[Win] 刪除連接埠內印表機-3

最後再把 LPT1 的 LQ-680C-2 改為 LQ-680C,就搞定收工

Friday, May 20, 2016

[SQL] 使用者自訂函數應用

論壇問題
要在預設值(default)和計算欄位(Computered Column)內,把欄位名稱當成變數傳入使用者自訂函數(udf)內來填值
以下利用 TSQL 測試該情況

使用 AdventureWorks2014 DB,在內建立 Orders 和 OrdersDetail Table
USE [AdventureWorks2014]
GO

IF OBJECT_ID('Orders') IS NOT NULL
    DROP TABLE Orders

IF OBJECT_ID('OrdersDetail') IS NOT NULL
    DROP TABLE OrdersDetail

CREATE TABLE [dbo].[Orders](
    [OrderNO] [char](11) NOT NULL,
    [DetailCount] [int] NOT NULL, -- 之後要設定 udf(ColumnName) 用
    CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED([OrderNO] ASC)
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[OrdersDetail](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [OrderNO] [char](11) NOT NULL CONSTRAINT [DF_OrdersDetail_Orders]  DEFAULT (''),
    [Product] [nchar](30) NOT NULL CONSTRAINT [DF_OrdersDetail_Product]  DEFAULT (''),
    [UnitPrice] [money] NOT NULL CONSTRAINT [DF_OrdersDetail_UnitPrice]  DEFAULT ((0)),
    [Qty] [int] NOT NULL CONSTRAINT [DF_OrdersDetail_Qty]  DEFAULT ((0)),
    CONSTRAINT [PK_OrdersDetail] PRIMARY KEY CLUSTERED ([ID] ASC)
) ON [PRIMARY]
GO
建立使用者自訂函數
  • uspGetDetailCount:用來取的 detail 內有多少筆資料
  • uspGetTotalPrice:用來加總 detail 內金額
IF OBJECT_ID(N'dbo.uspGetDetailCount', N'FN') IS NOT NULL
    DROP FUNCTION dbo.uspGetDetailCount
GO

IF OBJECT_ID(N'dbo.uspGetTotalPrice', N'FN') IS NOT NULL
    DROP FUNCTION dbo.uspGetTotalPrice
GO

CREATE FUNCTION uspGetDetailCount(@OrderNO char(11))
RETURNS int
BEGIN
    RETURN
    (
        SELECT count(*)
        FROM OrdersDetail
        WHERE OrderNO = @OrderNO
    )
END
GO

CREATE FUNCTION uspGetTotalPrice(@OrderNO char(11))
RETURNS int
BEGIN
    RETURN
    (
        SELECT sum(UnitPrice * Qty)
        FROM OrdersDetail
        WHERE OrderNO = @OrderNO
    )
END

Thursday, May 19, 2016

網購烏龍

最近參加了體育場籃球全場團,所以保健軟膏比較常擦,想說快用完,要再買條來 stnadby,然後烏龍就發生了

收到商家 mail 告知軟膏已經送到指定超商,可以去拿囉

網購烏龍-1

跟小姐確認要來提貨時,她竟然跟我說沒有,拿手機 show 出 mail 給對方看,她一直強調要有簡訊才算數,印象中並沒有收到簡訊通知,回家上網站確認後發現,為什麼收件人不是我啊,Orz

網購烏龍-3

心裡打算明天要打課服確認,就在把電腦關閉那瞬間,突然想到,購物系統不會沿用上次收件人資訊,201506 朋友婚禮買帳篷,確實是直接寄到 *紹* 那,再上網站確認收件人電話,bingo

這次去總算是拿到軟膏,>.<

網購烏龍-2